12

我需要计算 C 中数字的以 2 为底的对数,但我不能使用数学库。答案不需要精确,只需要最接近的 int。我已经考虑过了,我知道我可以只使用一个 while 循环并将数字除以 2 直到它 < 2,并保持迭代计数,但是这可以使用按位运算符吗?

4

2 回答 2

18

abamert 已经回答了,但更具体地说,这就是你将如何编码:

Log2(x) = result
while (x >>= 1) result++;   
于 2013-08-09T04:21:23.940 回答
13

如果将移位算作按位运算符,这很容易。

您已经知道如何通过连续除以 2 来做到这一点。

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

如果您需要加快速度,您可以进行“分而治之”——例如,一次移动 4 位,直到达到 0,然后返回查看最后 4 位。这意味着最多 16 个班次和 19 次比较,而不是每个班次 63 次。在现代 CPU 上是否真的更快,我不能不经过测试就说。你可以更进一步,先做 16 组,然后 4 组,然后 1 组。在这里可能没用,但如果你有一些 1024 位整数,可能值得考虑。

于 2013-02-08T07:03:18.083 回答