C程序 - 找到2数幂幂的指数的最简单方法是什么

时间:2015-09-15 08:17:52

标签: c algorithm

n = 2 ^ x

我知道n的价值,找到x的价值的有效方法是什么?

5 个答案:

答案 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)

我猜你在考虑整数,例如longint(以及他们的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);