题目:
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘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为止。