1. 程式人生 > >劍指offer刷題-數二進位制表示中1的個數

劍指offer刷題-數二進位制表示中1的個數

題目描述

時間限制: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')