《剑指offer》15. 二进制中1的个数 python

位运算

def hammingWeight(self, n: int) -> int:
	# python 的int是无限大的,所以不能以unsigned flag溢出来判断
	 flag = 1
	 count = 0
	 for i in range(32):
	     if n & flag != 0:
	         count += 1
	     flag = flag << 1
	 return count

最好不要采用右移n,和1与的方式,若n < 0会导致高位上1,最终数字变为0xFFFFFFFF(全1,32位),陷入死循环。所以采用一个不断乘2的flag来和n进行与操作。

n&(n−1)

def hammingWeight2(self, n:int) -> int:
        count = 0
        while n:
            n &= n-1
            count += 1
        return count

另一种方法利用n&(n-1)永远使最右边的1变为0,其余不变的性质(n-1改变的只有最右边的1以及其右边的数字,其中最右边的1变为0,其右边的0变为1,如果有的话。那么对于这些改变了的数字,与原数字相与的结果就是0,总体看来,也就是将最右边的1变为了0)。能与几次就说明有几个1(最终n=0)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值