【发布时间】:2013-11-18 22:38:34
【问题描述】:
我想用 C 语言编写一个函数,它采用uint8_t 的 MSB,如果已设置,则返回 0xFF,否则返回 0x00。简而言之,它返回一个整数,其中所有位都设置为与 MSB 相同的值。
但我想以完全恒定的时间方式进行,没有分支,没有数组偏移,只是保证始终触及相同位数的数学运算。理想情况下,没有任何未定义的行为。如何做到这一点?
【问题讨论】:
-
在 C# 中,我使用
(uint8_t)((int8_t)x >> 7)的等价物,但我不确定这在 C 中是否明确定义。 -
@CodesInChaos:不是;右移有符号值的结果是实现定义的,尽管在实践中你很难找到没有将其编译为算术移位的实现。 (基本上,C 标准没有定义它的原因是因为它不假设有符号算术必须使用 2 的补码来完成。)
标签: c cryptography bit-manipulation