这是对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
),因此在最后一步中不了解经过校正的&的& 。谢谢!
答案 0 :(得分:0)
(unsigned int)((int)(0x70 - tmp) >> 4) >> 27
等效于 1 与
(int)(0x70 - tmp) < 0 ? 0x1f : 0
但要保证不涉及分支-而是从提取结果中提取符号位,将其复制4次,然后降档以获取0x1f或0(取决于)。
1 在负号的有符号右移执行适当的算术移位的假设下-不是由C规范保证的,但是在大多数实现中都是常见的