劍指—JZ11二進制中1的個數

題目描述

輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。

解題思路

首先理清正數和負數在計算機中二進制表示,假設計算機是32位的,對於一個正數5,其原碼二進制表示爲000....0101,其反碼和補碼均與原碼相同,而對於負數-5,其原碼爲1000...0101,最高位爲符號位,1表示是負數,那麼其反碼就是除符號位外逐一取反即11111... 1010,補碼就是反碼加1即1111...1011,python中對於負數進行與操作都會進入死循環,將其轉爲補碼形式:n = n & 0xffffffff,即可將n變爲補碼形式,並且計算機當作正數來進行處理。

統計二進制中1的個數,可以通過n & (n - 1)來計算,這裏以8位爲例,假設n = 11101000,那麼n - 1 = 11100111,所以n & (n -1)爲11100000,就把從右邊開始第一個0濾掉了,新的n即爲11100000,新的n - 1爲11011111,所以新的n & (n - 1)爲11000000,又過濾掉了一個0。直到新的n爲0後即退出

class Solution:
    def NumberOf1(self, n):
        # write code here
        if n < 0:
            n = n & 0xffffffff
        res = 0
        while n != 0:
            res += 1
            n = n & (n - 1)
        return res

S = Solution()
print(S.NumberOf1(-5))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章