判断正整数n是否为2的幂的正确方法是:n > 0 && (n & (n - 1)) == 0,因其利用二进制中仅一个1的特性,通过位运算高效验证,且排除了n≤0的非法情况。

一个正整数是 2 的幂,当且仅当它的二进制表示中**有且仅有一个 1**,其余全是 0。利用这个特性,可以用位运算高效判断,无需循环或取对数。
核心技巧:n & (n - 1) == 0
对于任意正整数 n,若 n 是 2 的幂(如 1、2、4、8…),则 n 的二进制形如 100...0,而 n−1 的二进制是 011...1。两者按位与结果必为 0。
- 例如:n = 8 → 二进制 1000,n−1 = 7 → 0111,1000 & 0111 = 0000
- 再如:n = 6 → 110,n−1 = 5 → 101,110 & 101 = 100 ≠ 0,不是 2 的幂
⚠ 注意:该式对 n = 0 也成立(0 & −1 = 0),但 0 不是 2 的幂,所以必须额外排除 n ≤ 0 的情况。
完整判断条件
正确写法是:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- n > 0 排除非正数(0 和负数)
- (n & (n - 1)) == 0 确保只有一个 bit 为 1
这是最常用、最简洁、也是 JDK 中 Integer.bitCount(n) == 1 的底层优化替代方案。
为什么不用 n & -n == n?
这个写法也成立(因为 −n 的补码等于 ~n + 1,对 2 的幂而言,n & −n 恰好等于 n),但它稍难理解,且在语义上不如 n & (n−1) 直观。实际开发中推荐前者。
边界情况提醒
需特别注意以下值:
- n = 1:1 是 2⁰,满足 1 > 0 && (1 & 0) == 0 → true
- n = 0:不满足 n > 0 → false
- n = 负数:如 −4,二进制含多个 1,且 n > 0 不成立 → false
该方法只适用于 int 或 long 类型的整数,不涉及浮点或大数。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










