如何使用按位运算符计算机记录基数2?

SKL*_*LAK 9 c bit-manipulation logarithm operator-keyword

我需要在C中计算数字的日志基数2,但我不能使用数学库.答案不需要精确,只需要最接近的int.我已经考虑过了,我知道我可以使用while循环并继续将数字除以2,直到它<2,并保持迭代次数,但这是否可以使用按位运算符?

小智 13

已经由abamert回答了但是为了更具体一点,这就是你如何编码它:

Log2(x) = result
while (x >>= 1) result++;   
Run Code Online (Sandbox Code Playgroud)


aba*_*ert 10

如果将移位计算为按位运算符,则这很容易.

你已经知道如何通过2连续除法来做到这一点.

x >> 1x / 2C中的任何无符号整数相同.

如果你需要更快地做到这一点,你可以一次"分而治之" - 换档,比如4位,直到你达到0,然后回去看看最后4位.这意味着最多16个班次和19个比较,而不是每个63个.无论它在现代CPU上实际上是否更快,我都不能说没有测试.你可以更进一步,首先做16组,然后是4组,然后是1组.可能在这里没用,但如果你有一些1024位整数,那么可能值得考虑.