题目详情
给你一个整数 n
,请你判断该整数是否是 2 的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 n == 2^x
,则认为 n
是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释:2^0 = 1
示例 2:
输入:n = 16
输出:true
解释:2^4 = 16
示例 3:
输入:n = 3
输出:false
提示:
-2^31 <= n <= 2^31 - 1
进阶:
你能够不使用循环/递归解决此问题吗?
解题思路
要判断一个整数 n
是否是 2 的幂次方,可以利用二进制表示的特性:
- 2 的幂次方的二进制特征:其二进制形式有且仅有一个
1
,其余位均为0
。例如:1
(2^0
)的二进制:1
2
(2^1
)的二进制:10
4
(2^2
)的二进制:100
8
(2^3
)的二进制:1000
- 关键操作:利用位运算
n & (n - 1)
:- 如果
n
是 2 的幂次方,则n - 1
的二进制会将n
的最低位的1
变为0
,后续位变为1
。此时n & (n - 1) = 0
。 - 例如:
n = 4 (100)
,n - 1 = 3 (011)
,4 & 3 = 0
。
- 如果
- 边界处理:
- 非正数(
n <= 0
)直接排除,因为 2 的幂次方必须是正整数。 - 特殊处理
n = 1
(2^0
)符合条件。
- 非正数(
算法步骤:
- 若
n <= 0
,返回false
。 - 若
n & (n - 1) == 0
,说明n
是 2 的幂次方,返回true
;否则返回false
。
复杂度:
- 时间复杂度:
O(1)
,仅需一次位运算。 - 空间复杂度:
O(1)
,无额外空间。
代码实现
class Solution {
public boolean isPowerOfTwo(int n) {
// 排除非正整数,并利用位运算判断是否仅含一个二进制位1
return n > 0 && (n & (n - 1)) == 0;
}
}
代码说明
- 边界处理:
n > 0
确保排除负数和零。 - 位运算:
(n & (n - 1)) == 0
检测n
的二进制是否仅含一个1
:n - 1
将最低位的1
变为0
,后续位变为1
。- 按位与操作
n & (n - 1)
会消除最低位的1
,若结果为0
则说明原数字只有一个1
。
- 简洁性:单行返回结果,无循环或递归,满足进阶要求。