查询是否数字是2的幂

时间:2009-03-20 15:31:43

标签: algorithm

使用经典代码段:

if(x&(x-1))== 0

如果答案为1,那么它是假的而不是2的幂。但是,使用5(不是2的幂)和4会导致:

0001 1111 0001 1111 0000 1111

那是4个1。

在8和7上工作:

1111 1111 0111 1111

0111 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的幂?

4 个答案:

答案 0 :(得分:7)

你需要自己刷新二进制的工作原理。图5未表示为0001 1111(5位开启),其表示为0000 0101(2 ^ 2 + 2 ^ 0),并且4同样不是0000 1111(4位开启)而是0000 0100(2 ^ 2)。你写的数字实际上是一元

Wikipedia, as usual, has a pretty thorough overview.

答案 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的幂。