是否有任何快速算法来计算所有2的幂数的log2?

时间:2014-06-20 13:30:26

标签: c algorithm math

是否存在任何快速算法来计算2的所有幂的数字的log2,例如:

log2(1), log2(2), log2(4), log2(1024), log2(4096)...

我考虑使用它来实现位集迭代。

2 个答案:

答案 0 :(得分:18)

假设您知道数字必须为2的幂,所以在二进制中,1跟随n 0,其中n是您的数字正在寻找。

如果您使用的是gcc或clang,则可以使用builtin function

  

- 内置函数:int __builtin_ctz(unsigned int x)

     

从x开始,返回x中的尾随0位数   重要的位置。如果x为0,则结果未定义。

对于纯C实现,已经回答了

Finding trailing 0s in a binary number

答案 1 :(得分:1)

除了已经给出或链接的算法之外,还有三个理论上可能有效的算法。 n 是位数, N = 2 ^ n

  1. Big LUT:一次查询
  2. 简单二进制搜索:log2(n)比较
  3. LUT [N%k]与k位置LUT:一个模数,一个查找(32位为k = 37,64位为67)
  4. 在实践中,#1对于小 n 来说很棒,#2在某些硬件上可能是最快的(没有快速乘法的东西),但代码看起来很难看。 #3可能永远不会在真机上击败DeBruijn,但它的操作更少。