python中首先明确一点就是二进制没有位数的概念,所以也就无法获得负数真实表示方法
n = -3
n = n & 0xffffffff #n=4294967293
bin(n)#查看二进制形式:'0b11111111111111111111111111111101'
获得的最终结果python会认为是一个正数(因为没有位数的概念,所以首位的1并不代表符号位),那么获得
0b11111111111111111111111111111101
只是形式上和-3的补码相同。
python中,对于负数,无论是右移操作,还是n&(n-1)操作,都会陷入死循环。
所以利用上述这个小技巧,将负数的影响用于0xffffffff相与变为python认为的正数(与机器中的补码相同)。
然后利用正数来进行操作就简单了。
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        if n < 0:
            n = n & 0xffffffff
        while n:
                count += 1
                n = (n - 1) & n
        return count