如何编写一个常量时间函数来将最高有效位复制到所有位

Ale*_*nor 9 c cryptography bit-manipulation

我想在C中编写一个函数,该函数接受MSB uint8_t,如果设置了,则返回0xFF,如果不是0x00.简而言之,它返回一个整数,其中所有位都设置为与MSB相同的值.

但我想以完全恒定的时间方式完成它,没有分支,没有数组偏移,只是保证总是触摸相同位数的数学运算.理想情况下,没有任何未定义的行为.如何才能做到这一点?

Ilm*_*nen 6

怎么样:

#define uint8_msb_to_all_bits(x) (0xFF * ((x) >> 7))
Run Code Online (Sandbox Code Playgroud)

甚至更好:

#define uint8_msb_to_all_bits(x) (-((x) >> 7))
Run Code Online (Sandbox Code Playgroud)

这两种方法的工作方式是,如果x是8位无符号整数,则x >> 7如果x设置了MSB,则为1 ,否则为0.剩下的就是将1映射到0xFF,这可以通过乘法来完成,或者在这种特定情况下,简单地通过否定数来完成.

(是的,否定无符号数在C中已明确定义.)

  • 注意第二个选项将返回`-1`类型为`int` - 如果你想要'0xFF`,最好将结果显式地转换为`uint8_t`. (3认同)

650*_*502 5

关于什么

- (x >> 7)
Run Code Online (Sandbox Code Playgroud)

仅保留MSB,并使用数学否定将其复制到所有位.