您可以使用以下方法测试正整数
n是否为2的幂
(n & (n - 1)) == 0
如果
n可以是非正数(即负数或零),则应使用
(n > 0) && ((n & (n - 1)) == 0)
如果
n确实是2的幂,那么在二进制中它将看起来像:
10000000...
所以
n - 1看起来像
01111111...
当我们按位进行“与”运算时:
10000000...& 01111111... ----------- 00000000...
现在,如果
n不是 2的幂,那么它的二进制表示形式除了前导1外还有其他1,这意味着两个
n和
n -1都具有相同的前导1位(因为减去1可能无法关闭该位二进制表示中的另一个地方有1)。因此,如果不是2的幂,该
&操作将不会产生,因为将和的两个前导位都将自身产生。当然,这是肯定的。
0``n``&``n``n- 1``1``n
Wikipedia上的“用于检查正数是否为2的幂的快速算法”中也对此进行了说明。
快速健全性检查:
for (int i = 1; i <= 100; i++) { if ((i & (i - 1)) == 0) System.out.println(i);}1个248163264


