查询是否数字是2的幂

Gur*_*epS 0 algorithm

使用经典代码段:

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

Tyl*_*nry 7

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

像往常一样,维基百科有一个非常全面的概述.


Joe*_*oel 5

任何两个数的幂可以用二进制表示,具有单个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)