231.2的幂

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值