1的个数-191:n &=(n-1) 或 &1

力扣打卡:1的个数:191

解题思路

得到的提示,学习的技巧:一个数与上这个数减1,能将这个数的最后一个1去掉
学习链接

理解:
一个数n,当其减1时,会将二进制形式后的最后一个1变为0,最后一个1后面的0全部变为1,注意这里指的是最后一个1,不是说一定是最后一个数

当n与n-1相与时,就会将n的最后最后一个1去掉,其余部分不变,
因为n-1的二进制形式是n的二进制形式中最后一个1变为0,最后一个后面的0全部变为1,
所以n与上n-1就能将n的二进制形式的最后一个1去掉,其余部分不变

同时还有一种学习的技巧是位运算以及&1的技巧
常见的&1技巧是判断这个数是否为偶数,因为通过最后一个二进制位来判断,&1为0,那么为偶数,反之则为奇数
那么可以通过n的位移,将n的每一个二进制位都去&1,就能得到1的个数

代码

class Solution:
    def hammingWeight(self, n: int) -> int:
        # 学习到了一个数与上这个数减一,能将二进制的最后一个1去掉
        count = 0
        while n:
            n &= (n-1)
            count+=1
        return count
class Solution:
    def hammingWeight(self,n:ing) -> int:
    count = 0
    while n:
        if n & 1:
            count+=1
        n >>= 1

总结:
一个数与上这个数减1,能将这个数二进制的最后一个1去掉
一个数可以通过&1来判断奇偶数,因为&1可以将这个数的最后一个二进制数拿到,如果为0则为偶数,反之,则为奇数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值