如果我有一个我确定是2的幂的数字,有没有办法得到这个数的两个幂?我想到了这个想法: 有一个计数并将数字右移1并递增计数直到数字为0.还有另一种方法吗?没有保持柜台?
编辑: 这里有些例子: 8 - >返回3 16 - >返回4 32 - >返回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);
}