231.2的幂
给你一个整数
n
,请你判断是否是2的幂次方。如果是,则返回true
;否则,返回false
。
如果存在一个整数x
使得 n = = 2 x n==2^x n==2x,则认为n
是2的幂次方。
方法一:循环整除2
对n轮番除2,直至不能整除,若此时n为1则说明n是2的幂次方。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n==0:
return False
while n%2==0:
n=n>>1
return True if n==1 else False
方法二:位运算
将n用二进制表示,当n是2的幂次方是,n中只存在一个1,其余位均为0。下面有两种技巧进行处理。
1、n & (n-1)
n-1的二进制表示为将n的最低位1变为0,该位后面的0全部变为1,该位前面不变,对n和n-1使用与运算,则该位以后全部为0,该位前面保持不变。若n为2的幂次,n的二进制表示只有一个1,因此n & (n-1) = 0。(如下图左)
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and n & (n-1) == 0
2、n & (-n)
-n在计算机中按补码存储,即将n各位取反后加1,最终结果是保留最低位1即之后的0,然后将高位全部取反。n & (-n)的结果为保留最后一位1,其余位全部归0(如上图右)。若n为2的幂次方,则n只存在一位1,则有n & (-n) == n。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and n & (-n) == n