判断正整数n是否为2的幂,需满足n>0且n&(n−1)==0;因0和负数不满足定义,仅用位运算会误判0,故必须先检查n>0。

一个正整数是 2 的幂,当且仅当它的二进制表示中**只有一个 1**,其余全是 0(比如 1→1,2→10,4→100,8→1000)。利用这个特性,可以用位运算高效判断。
核心技巧:n & (n - 1) == 0
这是最常用、最简洁的判断方法。原理是:
- 若 n 是 2 的幂(如 8 =
1000),则 n−1 的二进制是低位全 1(如 7 =0111); - n & (n−1) 的结果必为 0(
1000 & 0111 = 0000); - 注意:要额外排除 n ≤ 0 的情况,因为 0 和负数不是 2 的幂。
代码示例:
public static boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}为什么不能只用 n & (n - 1) == 0?
因为 0 满足 0 & (0 - 1) == 0 & (-1) == 0(在补码中 −1 全为 1,但 0&全1 仍为 0),但 0 不是 2 的幂;负数同理,不满足数学定义。所以必须先确保 n > 0。
其他等价写法(了解即可)
以下写法逻辑等价,但可读性或效率略低:
-
(n & -n) == n:利用负数的补码特性,-n是n的最低位 1 及其右侧取反,所以n & -n得到的是 n 的最低位 1。若 n 只有一个 1,则结果等于 n; -
Integer.bitCount(n) == 1:统计 1 的个数,但底层调用了循环或查表,不如位运算快。
边界情况验证
测试几个关键值:
-
1 →
1 & 0 == 0,且 1 > 0 → ✅ - 0 → 不满足 n > 0 → ❌
-
3(
11)→3 & 2 == 2 ≠ 0→ ❌ -
16(
10000)→16 & 15 == 0→ ✅
不复杂但容易忽略符号和零的处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











