231. 2 的幂
https://leetcode-cn.com/problems/power-of-two/
给你一个整数 n
,请你判断该整数是否是 2 的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 $n == 2^x$
,则认为 n
是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释:20 = 1
示例 2:
输入:n = 16
输出:true
解释:24 = 16
示例 3:
输入:n = 3
输出:false
示例 4:
输入:n = 4
输出:true
示例 5:
输入:n = 5
输出:false
提示:
- − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31} - 1 −231<=n<=231−1
**进阶:**你能够不使用循环/递归解决此问题吗?
解法1 直接模拟法
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n == 0:
return False
while n % 2 == 0:
n //= 2
return n == 1
解法2 位运算
思路:
一个数 n 是 2 的幂,当且仅当 n 是正整数,并且 n 的二进制表示中仅包含 1 个 1
2的幂的特点 最高位为1 剩下的位都为 0
8 : 1000
16 : 10000
32 : 100000
位运算小技巧: n & n-1
会将n的二进制最后一位的1 会变成 0
>>> bin(16)
'0b10000'
>>> bin(15)
'0b1111'
看这个例子, 16 &15=0
1 | 0 | 0 | 0 | 0 | |
16 & 15 | 0 | 1 | 1 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
"""
n &(n-1)
该位运算技巧可以直接将 n 二进制表示的最低位1 移除
:param n:
:return:
"""
if n == 0:
return False
return n > 0 and n & (n - 1) == 0
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n <= 0:
return False
else:
return n & (n - 1) == 0