一行代码,背后是对二进制和位运算的深度理解
一、题目描述
给定一个整数 n,判断它是否是 2 的幂。
如果是,返回 true;否则返回 false。
示例
输入:n = 1
输出:true (2⁰)
输入:n = 16
输出:true (2⁴)
输入:n = 3
输出:false
输入:n = 0
输出:false
二、最优解一行代码
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
}
看起来很“魔法”?
下面我们一步一步拆开它。
三、为什么要先判断 n > 0?
2 的幂有哪些?
1, 2, 4, 8, 16, 32, ...
👉 全部都是 正整数
所以:
n <= 0→ 一定不是 2 的幂- 必须先排除掉
📌 这是一个 语义判断 + 防止误判
四、核心关键:n & (n - 1) 到底干了什么?
先复习一个二进制规律
2 的幂在二进制里,只有一个 1
| 十进制 | 二进制 |
|---|---|
| 1 | 0001 |
| 2 | 0010 |
| 4 | 0100 |
| 8 | 1000 |
再看 n - 1 会发生什么?
例子:n = 8
n = 1000
n - 1 = 0111
👉 最高位的 1 变成 0,后面的全变成 1
最关键一步:按位与 &
1000
& 0111
------
0000
结果为 0
五、为什么“只有 2 的幂”才满足这个条件?
再看一个反例:n = 6
n = 0110
n - 1 = 0101
0110
&0101
-----
0100 ≠ 0
📌 因为 有多个 1,按位与后不可能为 0。
六、结论公式
一个正整数是 2 的幂
当且仅当:n & (n - 1) == 0
这是位运算里最经典的结论之一。