【剑指offer】二进制中1的个数(python)

思路:n&(n-1)位运算可以将n的位级表示中最低的那一位1置0。不断将1设置为0,直到n为0。
负数时注意补码转换。
补码:设某负数X,则X+X(反)= 0xFFFFFFFF,所以X+X(反)+1 = 0,可以得出 0 - X = X(反)+ 1这里 0 - X即定义为负数X的补码,这样,计算机在进行X-Y运算时实际可用X+Y(补)代替,硬件角度只需实现加法电路即可。同样的道理,0-X(补)=X(补)(反)+1 = X,即已知负数补码只需对其各位取反加一即可得到原码。

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        # 注意负数的补码转换
        cnt = 0
        if n < 0:
            n &= 0xffffffff
        while n:
            cnt += 1
            n &= (n-1)
        return cnt