计算任何数字的log(base2)的最佳方法是什么?

时间:2014-06-09 09:57:37

标签: c linux linux-kernel linux-device-driver

我需要在Linux内核编程中找到任何数字的log(base2)。 这个操作有内置功能吗? 如果不是如何计算它?

2 个答案:

答案 0 :(得分:1)

如果它对你来说足够整数,你可以多次除以2.像

这样的东西
int logFunc(unsigned int x) 
{ 
   int log = -1; 
   while(x) { 
    log++; 
    x >>= 1; 
   } 
   return log; 
} 

如果您需要fp操作,请阅读:

  

[...]如果问题是“我可以在内核中使用FP”那么   答案仍然是一个响亮的NO,因为其他架构可能不会   全力支持。

  Linus
     

Link

另外,您可以查看:Use of floating point in the Linux kernel

编辑:如果您需要更快的版本,可以阅读Bit Twiddling Hacks - By Sean Eron Anderson

uint32_t v; // find the log base 2 of 32-bit v
int r;      // result goes here

static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
  8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};

v |= v >> 1; // first round down to one less than a power of 2 
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;

r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];

答案 1 :(得分:1)

根据定义,任何特定基数B中的数字N的对数等于log(N)/log(B),其中log()可以是自然对数(基数e),或任何其他基数(例如基数10),只要log(N)log(B)都是根据相同的基数计算的。