使用经典代码段:
if(x&(x-1))== 0
如果答案为1,那么它是假的而不是2的幂。但是,使用5(不是2的幂)和4会导致:
0001 1111 0001 1111 0000 1111
那是4个1。
在8和7上工作:
1111 1111 0111 11110111 1111
0是第一,但我们有4。
在这两种情况的链接(http://www.exploringbinary.com/ten-ways-to-check-if-an-integer-is-a-power-of-two-in-c/)中,答案从0开始,并且可变数量为0/1。这是如何回答这个数字是2的幂?
答案 0 :(得分:7)
你需要自己刷新二进制的工作原理。图5未表示为0001 1111(5位开启),其表示为0000 0101(2 ^ 2 + 2 ^ 0),并且4同样不是0000 1111(4位开启)而是0000 0100(2 ^ 2)。你写的数字实际上是一元。
答案 1 :(得分:5)
任何两个数的幂都可以用二进制表示,单个1和多个0。
eg.
10000(16)
1000(8)
100(4)
如果你从两个数字的任何幂中减去1,你将得到原始数字右边的所有1。
10000(16) - 1 = 01111(15)
AND和这两个数字每次都会给你0。
如果是两个数字的非幂,减去一个将使数字中的至少一个“1”保持不变,如:
10010(18) - 1 = 10001(17)
对这两个进行AND运将导致
10000(16) != 0
答案 2 :(得分:1)
请记住,如果x是2的幂,则正好设置1位。减去1,你知道两件事:结果值不是2的幂,并且不再设置已设置的位。因此,当您执行按位和&
时,x
中设置的每个位都不会被设置,并且(x-1)
中设置的所有位都必须匹配x
中未设置的位。所以每个位的和总是为0。
换句话说,对于任何位模式,保证(x&(x-1))
为零。
答案 3 :(得分:0)
((n&(n-1))== 0)
检查“n”的值是否为2的幂。
示例:
if n = 8, the bit representation is 1000
n & (n-1) = (1000) & ( 0111) = (0000)
So it return zero only if its value is in power of 2.
The only exception to this is ‘0’.
0 & (0-1) = 0 but ‘0’ is not the power of two.
为什么这有意义?
想象一下从一串位中减去1时会发生什么。你从左到右阅读, 将每个0转为1直到你达到1,此时该位被翻转:
1000100100 - > (减1) - > 1000100011
因此,每一位,直到第一位,都被翻转。如果数字中只有一个1,那么每个位(除前导零之外)都将被翻转。因此,n& (n-1)== 0如果只有一个1.如果只有一个1,那么它必须是2的幂。