【发布时间】:2021-08-11 11:51:12
【问题描述】:
假设我们将 1 位移了某个数字 x;例如,在 c 中:
unsigned char cNum= 1, x= 6;
cNum <<= x;
cNum 将等于 01000000b (0x40)。
简单易懂。但是如果不使用查找表或 while 循环,是否有一个简单的操作可以获取 cNum 并返回 x?
【问题讨论】:
-
您要做的是计算前导零,或找到第一个位。一些平台有可以做到这一点的指令,而一些语言有使用这些指令的简单方法。您以 C 为例,但并不清楚您是在寻找通用的数学方法,还是特定的语言实现。
-
我将使用 c 来实现答案,但如果有人要解释使用简单数学找到 x 的优雅方法,那很好。
-
C 中没有标准的方法可以快速完成。 POSIX 添加了
ffs,GCC 添加了内在函数,一个好的编译器甚至可以检测到手动循环并使用正确的指令对其进行优化。 -
我已经修改了标题,因为我真的只想要最简单的方法来获取仅设置一个位的位图中的位索引。 log2() 会这样做,但需要一个浮点数;我更喜欢使用整数。
-
如果您想要标准 C,最好的方法是查看这个 C++ 问题中的答案:stackoverflow.com/questions/994593/…。
标签: math binary bit-manipulation bit