我想用 C 语言编写一个函数,它采用以下的 MSBuint8_t
,如果已设置,则返回0xFF
如果不0x00
。简而言之,它返回一个整数,其中所有位都设置为与 MSB 相同的值。
但我想以完全恒定的时间方式来完成它,没有分支,没有数组偏移,只是数学运算,保证始终接触相同数量的位数。理想情况下,没有任何未定义的行为。如何才能做到这一点?
怎么样:
#define uint8_msb_to_all_bits(x) (0xFF * ((x) >> 7))
甚至更好:
#define uint8_msb_to_all_bits(x) (-((x) >> 7))
这两者的工作方式是,如果x
是一个8位无符号整数,那么x >> 7
如果 MSB 为 1x
已设置,否则为 0。剩下的就是将 1 映射到 0xFF,这可以通过乘法来完成,或者在这种特殊情况下,只需对数字求负即可。
(Yes, C 中明确定义了对无符号数求反 https://stackoverflow.com/a/1269049.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)