方法一:位运算
思想:由于给的n有32位,从n的低位开始,将n与1进行“与”运算(即从低位开始寻找n中的1,此处使用左移位运算符),如果相“与”的结果为1,表示n中含有1,将ret加上1,最后返回1总共的个数ret
class Solution:
def hammingWeight(self, n: int) -> int:
ret = 0
for i in range(32):
if n & (1 << i):
ret += 1
return ret
注意:要获得二进制形式的字符串需要使用bin()函数,直接将n使用str()得出的是int的字符串形式,如n = 0110,str(n)为“5”,而不是“0110”
方法二:位运算的优化
思想:由于n & (n-1)获得的结果为n将最低位的1变成0,所以使用这个特性,当结果为0时,n中的1全部转换成了0,即能统计全部的1个数(这样就不需要将32位全部进行“与”运算,减少了运算时间)
class Solution:
def hammingWeight(self, n: int) -> int:
ret = 0
while n:
n &= n-1 #每次相“与”之后,消除了n的最低为1,即每次相“与”n就有一个1,直到n为0,就可求出n中的全部1
ret += 1
return ret
方法三:count()计数法
class Solution:
def hammingWeight(self, n: int) -> int:
return bin(n).count('1')