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

1. 题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

2. 题目分析

  • 主要算法:对于二进制数nn \& (n-1)操作相当于去掉n从右边起第一个1;其中\&是逻辑运算与,例子:
n   = 0100100
n-1 = 0100011
n & (n-1) = 0100000 # 相较于0100100 从右起第一个1去掉了
  • 故求n中有多少个1,可以循环与n-1做与运算
  • 对于负数m,计算机运算有以下几个原则:
    1. 都以补码的形式,进行加法运算
    2. 所得结果也为补码
    3. 如果是负数,运用上述算法运算,最终定会得到10000000&11111111-0和-1做与运算,答案始终为-0,即10000000,会陷入死循环,如果执行上述代码会陷入死循环。
  • 综上代码应考虑负数情况,将其补码最高位经过转换后变为0,而其他位不变,这意味着计数的时候需要再加上1

3. 代码

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        if n < 0:
            n = n & 0xffffffff
        count = 0
        while n: # 循环终止的条件是为0
            count += 1
            n = n&(n-1)
        return count
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容