题目在这:​​https://leetcode-cn.com/problems/number-of-1-bits/​

法一 :(一行代码法)

思路分析

直接将给的数字变成二进制数,使用count()函数统计其中1的个数就行了。

完整代码:

return ('{:0b}'.format(n).count('1'))

法二: (右移法)

思路分析:

可以将所给数每次都和1进行 与 操作。操作完后将数字向右移一位。
移动后 前面补0,当整个数字都是0的时候,结束。

比如: 所给数字为 ​​0101110001​​​ 该数字和1进行 与操作。则除了最后一位是1以外,其他都是0、所以 与 操作之后 得到1。然后后移继续比较所给数字的末尾数。
若给的数字最后一位是0.则 与 操作之后得到的也是0.
这样我们就可以统计出来所给数里面有多少个1了。

完整代码

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

法三 (n&(n-1)):

思路分析:

让所给数字和 该数字-1 进行与操作,即​​n&(n-1)​​​。
这个方法实际上和法二有些类似,只是不需移动数字,
每次都和自己-1 进行 与操作。
每进行一次 与操作 则记录 +1

比如 ​​0101​​​ 和他减一进行 与操作 得到 ​​0100​​​。 记录 +1
​​​0100​​​ 再和他减一 进行 与操作 得到 ​​0000​​​。 记录 +1
所以​​​0101​​里有两个1

完整代码:

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