⚡ LeetCode|2 的幂(Power of Two)学习笔记

8 阅读1分钟

一行代码,背后是对二进制和位运算的深度理解


一、题目描述

给定一个整数 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

十进制二进制
10001
20010
40100
81000

再看 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

这是位运算里最经典的结论之一。