剑指offer-二进制中1的个数

147 阅读1分钟

二进制中1的个数

思路

class Solution:
    def NumberOf1(self, n):
        if n < 0:
            n = n & 0xffffffff  # 得到一个正数,这个正数的补码和原来负数的形式一样
        count = 0
        while n:
            count += 1
            n = n & (n - 1)
        return count
"""
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

你可以假设一个数字n,然后与 n-1 进行按位与,你会发现除了最靠右的 1 置零后,
其他的高位的 1 没有发生变化,每运行一次,就可以知道有一个 1 。
对于负数,最高位为1,而负数在计算机是以补码存在的,往右移,符号位不变,符号位1往右移,
最终可能会出现全1的情况,导致死循环。与0xffffffff相与,就可以消除负数的影响

举例来说,6的二进制是 110 ,6-1=5的二进制是 101,6&5=100,
如此操作之后6中原来的110变为100,循环计数统计1的个数,直至n变为0为止。
给定一个数n,每进行一次n&(n-1)计算,其结果中都会少了一位1,而且是最后一位。
"""