我需要计算C中数字的日志基数2,但我不能使用数学库。答案不需要精确,只需要最接近的int。我已经考虑过了,我知道我可以使用while循环并继续将数字除以2,直到它为< 2,并保持迭代的计数,但这是否可能使用按位运算符?
答案 0 :(得分:12)
abamert已经回答了,但为了更具体一点,这就是你编写代码的方法:
Log2(x) = result
while (x >>= 1) result++;
答案 1 :(得分:8)
如果将shifting计为按位运算符,这很容易。
你已经知道如何通过连续2分区来完成它。
对于C中的任何无符号整数, x >> 1
与x / 2
相同。
如果你需要加快速度,你可以一次“分而治之” - 换档,比如4位,直到你达到0,然后再回头查看最后4位。这意味着最多16个班次和19个比较,而不是每个63个。无论它在现代CPU上实际上是否更快,我都不能说没有测试。你可以更进一步,首先做16组,然后是4组,然后是1组。可能在这里没用,但如果你有一些1024位整数,那么可能值得考虑。