Leetcode-231-2的幂

本文介绍了一种高效判断整数是否为2的幂次方的方法。通过分析2的幂次方的二进制特性,提出了三种不同的实现方式,包括正向计算、反向计算和利用位运算的巧妙解决方案。

题目描述

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
examples

解题思路

判断一个整数是否是2的幂次方,可以利用2的幂次方的特性,把数字变成二进制来看。
我们知道,如果一个数字n是2的幂次方,那么它的二进制表示必定首位为1,其余位为0。而n-1的二进制表示中,首位变成了0,其余位是1.
例如,下图代表n=16时的二进制表示:

…… 2 4 2^{4} 24 2 3 2^{3} 23 2 2 2^{2} 22 2 1 2^{1} 21 2 0 2^{0} 20
n=1610000
n=1501111

&运算的特点是,相同为1,不同为0
这样的话,n和n-1做和运算(&),每位都是0&1,结果必然是0
也就是说如果n是2的幂次方,则n&(n-1)=0
如果n不是2的幂次方,结果则大于0
因此,利用&运算来判断

代码

代码一:正向计算
先贴上我2min之内完成的代码(laji code

import math
def isPowerOfTwo(self, n):
    p = 0
    if n <= 0:
        return False
    while True:
        num = math.pow(2, p)     
            
        if n < num:
            return False
        elif n == num:
            return True
        else:
            p += 1
            continue

代码二:反向计算

def isPowerOfTwo(self, n):
    if n:
        while n % 2 == 0 :
            n /= 2
        return n == 1
    return False

代码一和代码二的效率一样(一样低)

代码三:别人家的代码

def isPowerOfTwo(self, n):
    if n < 1:
        return False
    return not (n & (n-1))

简洁明了,高效舒服。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值