该技巧有效是因为2的整数次幂二进制仅含一个1,n&(n−1)会将该1及右侧位清零得0;必须加n>0条件排除0和负数;long类型需用长整型字面量避免溢出。

在 Java 中,可以用位运算符 & 配合一个经典技巧快速判断一个正整数是否为 2 的整数次幂:若 n > 0 且 (n & (n - 1)) == 0,则 n 是 2 的整数次幂。
为什么这个表达式有效?
2 的整数次幂的二进制表示只有一个 1,其余全是 0,例如:
- 1 →
1 - 2 →
10 - 4 →
100 - 8 →
1000
而 n - 1 会把该位及右边所有位翻转:唯一那个 1 变成 0,其右侧所有 0 全变成 1。所以 n & (n - 1) 必然为 0。
例如:n = 8(1000),n - 1 = 7(0111),1000 & 0111 = 0000。
立即学习“Java免费学习笔记(深入)”;
必须排除非正数
该技巧只对正整数成立。因为:
-
n = 0:0 & (-1)在 Java 中结果非零(-1是全 1 补码),逻辑错误; n :负数的二进制不是纯幂形式,且 <code>n - 1更小,无意义;
所以完整判断必须加上 n > 0 条件。
Java 示例代码
可封装为简洁的工具方法:
public static boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}测试用例:
-
isPowerOfTwo(1)→true -
isPowerOfTwo(16)→true -
isPowerOfTwo(3)→false -
isPowerOfTwo(0)→false -
isPowerOfTwo(-4)→false
注意 long 类型的适配
若判断 long 类型,写法一致,但需确保字面量和运算使用 long:
public static boolean isPowerOfTwo(long n) {
return n > 0L && (n & (n - 1L)) == 0L;
}避免因默认 int 运算导致高位截断或溢出误判。


















