<p>最高效方法是n > 0 && (n & (n - 1)) == 0:因2的幂二进制仅含一个1,n-1使该1变0、右侧全变1,按位与得0;非正数需排除,否则误判。</p>

判断一个整数是否是 2 的幂次方,最高效的方法就是用位运算:对于正整数 n,n & (n - 1) == 0 成立时,n 就是 2 的幂次方。
为什么 n & (n - 1) 能判断?
2 的幂次方在二进制中只有一个 1,其余全是 0。比如:
- 1 → 1
- 2 → 10
- 4 → 100
- 8 → 1000
而 n - 1 会把那个唯一的 1 变成 0,并把右边所有 0 全变成 1。例如:
- n = 8 → 1000,n−1 = 7 → 0111,1000 & 0111 = 0000
- n = 6 → 110,n−1 = 5 → 101,110 & 101 = 100 ≠ 0
必须注意的边界情况
这个技巧只对正整数有效,需额外排除非正数:
立即学习“Java免费学习笔记(深入)”;
n 直接返回 <strong>false</strong>(0 和负数都不是 2 的幂)- Java 中
Integer.MIN_VALUE是负数,不会误判
完整写法(推荐)
一行简洁、安全、高效的判断:
public static boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}其他位运算方式(了解即可)
虽然不如上面常用,但也可行:
-
n != 0 && (n & -n) == n:利用补码特性,-n是n的二进制负值,n & -n得到最低位的 1;若等于n,说明只有那一位是 1 - Java 8+ 可直接用
Integer.bitCount(n) == 1 && n > 0,但底层不是纯位运算,性能略低


















