剑指offer刷题-数二进制表示中1的个数

版权声明:虽然本文为博主原创文章,不过随便转载,但必须留下出处。 https://blog.csdn.net/Fighting_Dreamer/article/details/82928402

题目描述

时间限制:1秒 空间限制:32768K 热度指数:294626
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

当n>0时,就容易处理了

s = '%s' %  bin(n)
return s.count('1')

即可
n<0的时候要计算n的补码

模 = abs(n) + n的补码
n的补码 = 模 - abs(n)
其中模的概念如下
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。例如:
时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0~2(n)-1,模=2(n)。
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。

因此完整的代码如下

# -*- coding:utf-8 -*-
def intToBin32(i):
    #return (bin(((1 << 32) - 1) & i)[2:]).zfill(32)  # 也可以使用这个方法计算补码
    return (bin((1 << 32) - abs(i)))
class Solution:

    def NumberOf1(self, n):
        # write code here
        if n <0:
            s = '%s' % intToBin32(n)
        else:
            s = '%s' % bin(n)
        return s.count('1')

猜你喜欢

转载自blog.csdn.net/Fighting_Dreamer/article/details/82928402
今日推荐