是否有一种简单的方法可以获得两个数的幂?

时间:2011-06-03 03:40:25

标签: c

如果我有一个我确定是2的幂的数字,有没有办法得到这个数的两个幂?我想到了这个想法: 有一个计数并将数字右移1并递增计数直到数字为0.还有另一种方法吗?没有保持柜台?

编辑: 这里有些例子: 8 - >返回3 16 - >返回4 32 - >返回5

5 个答案:

答案 0 :(得分:2)

最优雅的方法是De Bruijn序列。以下是我对如何使用它们来解决问题的类似问题的回答:

Bit twiddling: which bit is set?

通常更实用的方法是使用cpu的内置指令来查找第一个/最后一个位集。

答案 1 :(得分:1)

如果该号码被称为x,您可以通过计算log2f(x)找到它。返回值是一个浮点数。

您需要添加<math.h>才能使用log2f

答案 2 :(得分:1)

这种方法肯定会奏效。另一种可能的方法是每次消除一半的可能性。假设您有一个8位数字:00010000

按位和你的数字,其中一半的位是1,另一半是零,比如00001111。

00010000&amp; 00001111 = 00000000

现在你知道它不在前四位。反复这样做,直到你没有得到0:

00010000&amp; 00110000 = 00010000

然后将它缩小到一个可能的位,即1,这是你的2的力量。

答案 3 :(得分:0)

您可以在cmath中使用日志功能...

double exponent = log(number)/log(2.0);

...然后将其转换为int。

答案 4 :(得分:0)

使用二分搜索而不是线性:

public void binarySearch() throws Exception {
  int num = 0x40000;

  int k = 0;
  int shift = 16; // half of the size of the type (for in 16, etc)
  int a = 0xffff; // lower half should be f's

  while (shift != 0) {
    if ((num & a) == 0) {
      num = num >>> shift;
      k += shift;
      shift >>= 1;
    } else {
      shift >>= 1;
    }
    a = a >>> shift;
  }
  System.out.println(k);
}