我需要在Linux内核编程中找到任何数字的log(base2)。 这个操作有内置功能吗? 如果不是如何计算它?
答案 0 :(得分:1)
如果它对你来说足够整数,你可以多次除以2.像
这样的东西int logFunc(unsigned int x)
{
int log = -1;
while(x) {
log++;
x >>= 1;
}
return log;
}
如果您需要fp操作,请阅读:
[...]如果问题是“我可以在内核中使用FP”那么 答案仍然是一个响亮的NO,因为其他架构可能不会 全力支持。
Linus
另外,您可以查看: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)
都是根据相同的基数计算的。