是否是 2 的幂次方
给你一个整数 n
,请你判断该整数是否是 2 的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 n == 2x
,则认为 n
是 2 的幂次方。
示例 1:
输入:n = 1 输出:true 解释:20 = 1
示例 2:
输入:n = 16 输出:true 解释:24 = 16
示例 3:
输入:n = 3 输出:false
提示:
-231 <= n <= 231 - 1
class Solution {
public:bool isPowerOfTwo(int n) {return n > 0 && (n & (n - 1)) == 0;
}
};
这里的 &
是按位与(bitwise AND)运算符:&
运算符会在两个数的二进制表示中逐位进行比较,只有当对应位都是 1 时,结果位才是 1,否则结果位是 0。
- 如果
n
是 2 的幂次方,它的二进制表示中只有 1 个 1,并且这个 1 是在某个固定位置,其余所有位都是 0。例如:- 1 的二进制表示:
0001
- 2 的二进制表示:
0010
- 4 的二进制表示:
0100
- 8 的二进制表示:
1000
- 1 的二进制表示:
n - 1
会将原来唯一的 1 变为 0,并且把它右边的所有位都变为 1。例如:- 对于
n = 8
(1000
),n - 1 = 7
(0111
) - 对于
n = 4
(0100
),n - 1 = 3
(0011
) - 对于
n = 2
(0010
),n - 1 = 1
(0001
)
- 对于
当 n
是 2 的幂次方时,n
和 n - 1
在二进制表示中没有任何相同的 1 位,所以 n & (n - 1)
结果为 0。