n = 2 ^ x
我知道n
的价值,找到x
的价值的有效方法是什么?
答案 0 :(得分:4)
假设你的意思是n = 2 x ,那么这就叫做 logarithm base 2 。
在C中你可以写:
double n = 512;
// ...
double x = log(n) / log(2); // 9
该公式适用于任何基础(由基础替换2
)。正如Kii所指出的那样,因为C99实际上有一个专门针对基础2
的函数:
double x = log2(n);
请注意,使用<tgmath.h>
代替<math.h>
将启用您正在使用的浮点类型的自动检测。
答案 1 :(得分:2)
我猜你在考虑整数,例如long
或int
(以及他们的unsigned
变体)如果您使用的是最近的GCC编译器,并且您确定 {{{ 1}}是2的幂,然后考虑使用n
builtin(或__builtin_ffs
用于__builtin_ffsll
等等...)函数(找到第一个设置位)。这可能是最快的。
答案 2 :(得分:1)
IF 它是一个正整数或一个无符号整数,你可以向右移动单个1位,直到你只有零,并计算你移动了多少次。
为了完整性而编辑(是的,我知道它对于num = 0来说是错误的:-p):
#include "stdio.h"
int main(void)
{
unsigned int num = 65536;
int pow = -1;
while (num > 0)
{
num >>= 1;
++pow;
}
printf("%d ", pow);
return 0;
}
答案 3 :(得分:1)
显而易见的方式:
unsigned int v; // 32-bit word to find the log base 2 of
unsigned int r = 0; // r will be lg(v)
while (v >>= 1) // unroll for more speed...
{
r++;
}
请参阅Stanford Bit Twiddling Hacks页面了解快速(O(lg(N))位黑客攻击。
答案 4 :(得分:0)
如果你可以使用内联汇编,如果输入是整数,最快的方法是计算最高位的位置。
int n = 9;
__asm
{
mov eax, n
bsr eax, eax
mov n, eax
}
printf("%d", n);