是否存在任何快速算法来计算2的所有幂的数字的log2,例如:
log2(1), log2(2), log2(4), log2(1024), log2(4096)...
我考虑使用它来实现位集迭代。
答案 0 :(得分:18)
假设您知道数字必须为2的幂,所以在二进制中,1
跟随n 0
,其中n
是您的数字正在寻找。
如果您使用的是gcc或clang,则可以使用builtin function
- 内置函数:int __builtin_ctz(unsigned int x)
从x开始,返回x中的尾随0位数 重要的位置。如果x为0,则结果未定义。
对于纯C实现,已经回答了
答案 1 :(得分:1)
除了已经给出或链接的算法之外,还有三个理论上可能有效的算法。 n 是位数, N = 2 ^ n :
在实践中,#1对于小 n 来说很棒,#2在某些硬件上可能是最快的(没有快速乘法的东西),但代码看起来很难看。 #3可能永远不会在真机上击败DeBruijn,但它的操作更少。