<p>一个正整数 n 是 2 的幂次方当且仅当 n > 0 且 n & (n - 1) == 0,因其二进制仅含一个 1,n-1 将该 1 变 0 并后缀置 1,按位与得 0;需排除非正数以避免误判。</p>

Java 中用位运算符 & 判断一个数是否是 2 的幂次方,核心思路是:**一个正整数 n 是 2 的幂次方,当且仅当它的二进制表示中只有一个 1,其余全是 0;此时 n & (n - 1) 的结果为 0**。
为什么 n & (n - 1) 能判断?
2 的幂次方在二进制下形如 1、10、100、1000……即只有一个最高位是 1。而 n - 1 会把这个唯一的 1 变成 0,并把后面所有位变成 1。例如:
- n = 8 → 二进制 1000,n - 1 = 7 → 0111,1000 & 0111 = 0000
- n = 6 → 二进制 0110,n - 1 = 5 → 0101,0110 & 0101 = 0100 ≠ 0
所以只要 n > 0 且 n & (n - 1) == 0,就一定是 2 的幂次方。
必须排除非正数
负数、0 和 1 需要特别处理:
立即学习“Java免费学习笔记(深入)”;
- 0 不是 2 的幂(2⁰ = 1,最小是 1)
- 负数在 Java 中用补码表示,不满足“单个 1”的结构,且逻辑上也不属于 2 的正整数幂
- 1 是 2⁰,符合定义,需保留
因此判断条件必须加上 n > 0。
一行代码写法
标准、安全的判断方式:
n > 0 && (n & (n - 1)) == 0
这个表达式既高效(O(1) 时间),又无需循环或数学函数,是面试和工程中常用技巧。
注意边界情况
Java 中 int 最大值是 2³¹−1,最大合法的 2 的幂是 2³⁰ = 1073741824。如果传入 2³¹(即 -2147483648,因为溢出),虽然 (n & (n - 1)) == 0 成立,但它不是真正的 2 的幂——所以仍要依赖 n > 0 过滤掉所有负数和零。


















