位运算
def hammingWeight(self, n: int) -> int:
# python 的int是无限大的,所以不能以unsigned flag溢出来判断
flag = 1
count = 0
for i in range(32):
if n & flag != 0:
count += 1
flag = flag << 1
return count
最好不要采用右移n,和1与的方式,若n < 0会导致高位上1,最终数字变为0xFFFFFFFF(全1,32位),陷入死循环。所以采用一个不断乘2的flag来和n进行与操作。
n&(n−1)
def hammingWeight2(self, n:int) -> int:
count = 0
while n:
n &= n-1
count += 1
return count
另一种方法利用n&(n-1)永远使最右边的1变为0,其余不变的性质(n-1改变的只有最右边的1以及其右边的数字,其中最右边的1变为0,其右边的0变为1,如果有的话。那么对于这些改变了的数字,与原数字相与的结果就是0,总体看来,也就是将最右边的1变为了0)。能与几次就说明有几个1(最终n=0)。