只是一个简单的布尔真/假非常有效会很好。我应该使用递归,还是有更好的方法来确定它?
答案 0 :(得分:13)
来自here:
确定整数是2的幂
unsigned int v; // we want to see if v is a power of 2 bool f; // the result goes here f = (v & (v - 1)) == 0;
请注意,此处0被错误地视为2的幂。要补救 这个,使用:
f = v && !(v & (v - 1));
为什么这样做?只有两个整数幂才能设置一个位。减1会产生将该位更改为零并将其下方的所有位更改为1的效果。使用原始数字AND
将始终导致全部为零。
答案 1 :(得分:3)
2的整数幂为1,后跟一个或多个零
即
Value value -1 (binary)
10 2 1
100 4 11
1000 8 111
10000 16 1111
mitch 表示
(value & (value-1)) == 0
当值是2的幂时(但除了1/0之外的任何其他数字都没有,1通常被视为2加权到零的幂)。
对于mitch的解决方案,其中数字> 0不是2的幂,即
value value - 1 V & (v-1)
1000001 1000000 1000000
1000010 1000001 1000000
1000100 1000011 1000000
1001000 1000111 1000000
1000011 1000010 1000010
1000101 1000100 1000100
1000111 1000110 1000110
永远不会为零。
从数字中减去1将位向上反转,包括第1位;因为两个人的权力只有一个'1'所以价值& (值-1)== 0,对于其他数字,第二个和后续的1不受影响。
需要排除零
另一种可能的解决方案(可能稍慢)是
A & (-A) == A
Powers of 2:
A -A
00001 & 11111 = 00001
00010 & 11110 = 00010
00100 & 11100 = 00100
其他一些数字:
A -A
00011 & 11101 = 00001
00101 & 11011 = 00001
你需要再次排除0
为了解决这个问题,我做了
这样做,我发现以下内容也有效:
A & (-A) == A
(not A) | (not A + 1) == -1 /* boolean not of a & (a-1) == 0 */
答案 2 :(得分:-1)
不确定您的计算速度或代码行方面是否有效。但你可以试试value == Integer.highestOneBit(value)
。如果需要,请不要忘记排除零。