有没有办法写log(base 2)函数?
C语言有2个内置函数 - >>
1. log基础e.
2. log10基数10;
但我需要基数2的日志功能.如何计算这个.
tom*_*gic 51
如果您正在寻找积分结果,您可以确定值中设置的最高位并返回其位置.
log*_*ray 40
#define M_LOG2E 1.44269504088896340736 // log2(e)
inline long double log2(const long double x){
return log(x) * M_LOG2E;
}
Run Code Online (Sandbox Code Playgroud)
(乘法可能快于除法)
如http://en.wikipedia.org/wiki/Logarithm所述:
logb(x) = logk(x) / logk(b)
Run Code Online (Sandbox Code Playgroud)
意思就是:
log2(x) = log10(x) / log10(2)
Run Code Online (Sandbox Code Playgroud)
如果你想快速,你可以使用像Bit Twiddling Hacks一样的查找表(仅限整数log2).
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];
Run Code Online (Sandbox Code Playgroud)
此外,你应该看看你的编译器内置的方法,如_BitScanReverse这可能会更快,因为它可以在硬件完全计算.
另请参阅可能的重复如何在C++中执行整数log2()?
uint16_t log2(uint32_t n) {//but truncated
if (n==0) throw ...
uint16_t logValue = -1;
while (n) {//
logValue++;
n >>= 1;
}
return logValue;
}
Run Code Online (Sandbox Code Playgroud)
和tomlogic的基本一样。