使用经典代码段:
if(x&(x-1))== 0
如果答案是1,那么它是假的而不是2的幂.但是,工作5(不是2的幂)和4导致:
0001 1111 0001 1111 0000 1111
那是4 1s.
在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,可变数为0/1.这是如何回答这个数字是2的幂?
你需要自己刷新二进制的工作原理.图5未表示为0001 1111(5位开启),其表示为0000 0101(2 ^ 2 + 2 ^ 0),并且4同样不是0000 1111(4位开启)而是0000 0100(2 ^ 2).你写的数字实际上是一元的.
任何两个数的幂可以用二进制表示,具有单个1和多个0.
eg.
10000(16)
1000(8)
100(4)
Run Code Online (Sandbox Code Playgroud)
如果你从两个数字的任何幂中减去1,你将得到原始数字右边的所有1.
10000(16) - 1 = 01111(15)
Run Code Online (Sandbox Code Playgroud)
对这两个数字进行AND运算每次都会给你0.
在非幂的两个数字的情况下,减去一个将使数字中的至少一个"1"保持不变,如:
10010(18) - 1 = 10001(17)
Run Code Online (Sandbox Code Playgroud)
和这两个将导致
10000(16) != 0
Run Code Online (Sandbox Code Playgroud)