计算快速日志基数2上限

什么是计算(long int)ceiling(log_2(i))的快速方法,其中输入和输出是64位整数?对于有符号或无符号整数的解法是可以接受的。我怀疑最好的方法将是一个bit-twiddling方法类似于那些发现here,但不是尝试我自己的我想使用已经测试的东西。一般解决方案将适用于所有正值。

例如,2,3,4,5,6,7,8的值为1,2,2,3,3,3,3

编辑:到目前为止,最好的路线似乎是使用任何数量的快速存在的bithack或寄存器方法计算整数/ floor log base 2(MSB的位置),然后添加一个如果输入不是二。对二的幂的快速按位检查是(n&(n-1))。

编辑2:整数对数和前导零方法的一个好的源是亨利S.沃伦在Hacker’s Delight的5-3和11-4。这是我发现的最完整的治疗。

这个算法已经发布,但是以下实现非常紧凑,应该优化到无分支代码。

int ceil_log2(unsigned long long x)
{
  static const unsigned long long t[6] = {
    0xFFFFFFFF00000000ull,
    0x00000000FFFF0000ull,
    0x000000000000FF00ull,
    0x00000000000000F0ull,
    0x000000000000000Cull,
    0x0000000000000002ull
  };

  int y = (((x & (x - 1)) == 0) ? 0 : 1);
  int j = 32;
  int i;

  for (i = 0; i < 6; i++) {
    int k = (((x & t[i]) == 0) ? 0 : j);
    y += k;
    x >>= k;
    j >>= 1;
  }

  return y;
}


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  printf("%d\n", ceil_log2(atol(argv[1])));

  return 0;
}
http://stackoverflow.com/questions/3272424/compute-fast-log-base-2-ceiling

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:计算快速日志基数2上限