python刷题记录——剑指 Offer 15. 二进制中1的个数

题目:

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。
在这里插入图片描述

你还在用bin(n).count(“1”)接口吗,不如看看其他方法。

方法一:
利用与运算和右移,将二进制数从最右边开始,逐位与1做与位运算。
0&1=0,1&1=1,累加结果,就是最后1的个数

class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            res += n & 1
            n >>= 1
        return res

方法二:
方法一中,有多少为二进制就要循环多少次,而方法二是有多少1就循环多少次

class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            res += 1  # 记录循环次数
            n &= n-1  # 逐渐将每个1变为0的关键步骤
        return res

关键步骤中,分两步理解。
第一步,先将n-1。n-1会有什么效果?
n-1会将从n最右边的1开始的数,全都置反,最右边1的左边不变。例如001100,减1后为001011。
第二步,再将n-1的结果和n做位与运算,上一步中将最右边1以及右边的0都置反了,做与运算当然都是0了,比如上面得到的001011和001100做与运算为00100,你看,是不是消灭最右边的1,变成0了。再循环,直到n变成000000为止。

猜你喜欢

转载自blog.csdn.net/weixin_45455015/article/details/118852982