0

这更像是对https://stackoverflow.com/a/5587983/13586005的跟进。@sam hocevar 或其他任何了解这一点的人:您介意解释这里发生的事情吗:

tmp = (tmp - 0x70) & ((unsigned int)((int)(0x70 - tmp) >> 4) >> 27);

我不确定我是否完全遵循它。我知道这(tmp - 0x70)是在纠正 127->15 偏差,但我不理解第二部分((unsigned int)((int)(0x70 - tmp) >> 4) >> 27),因此不理解 & 在最后一步中修正了偏差。谢谢!

4

1 回答 1

0
(unsigned int)((int)(0x70 - tmp) >> 4) >> 27

相当于1

(int)(0x70 - tmp) < 0 ? 0x1f : 0

但保证不涉及分支——而是从提取结果中提取符号位,复制 4 次,然后降档以获得 0x1f 或 0,具体取决于。


1在负数的有符号右移进行适当算术移位的假设下——不受 C 规范保证,但在大多数实现中很常见

于 2020-05-25T23:46:05.253 回答