我需要计算 C 中数字的以 2 为底的对数,但我不能使用数学库。答案不需要精确,只需要最接近的 int。我已经考虑过了,我知道我可以只使用一个 while 循环并将数字除以 2 直到它 < 2,并保持迭代计数,但是这可以使用按位运算符吗?
问问题
25859 次
2 回答
18
abamert 已经回答了,但更具体地说,这就是你将如何编码:
Log2(x) = result
while (x >>= 1) result++;
于 2013-08-09T04:21:23.940 回答
13
如果将移位算作按位运算符,这很容易。
您已经知道如何通过连续除以 2 来做到这一点。
x >> 1
x / 2
与C 中的任何无符号整数相同。
如果您需要加快速度,您可以进行“分而治之”——例如,一次移动 4 位,直到达到 0,然后返回查看最后 4 位。这意味着最多 16 个班次和 19 次比较,而不是每个班次 63 次。在现代 CPU 上是否真的更快,我不能不经过测试就说。你可以更进一步,先做 16 组,然后 4 组,然后 1 组。在这里可能没用,但如果你有一些 1024 位整数,可能值得考虑。
于 2013-02-08T07:03:18.083 回答