1. 程式人生 > >劍指offer:二進制中1的個數,判斷是否是2的整數次冪,二進制距離

劍指offer:二進制中1的個數,判斷是否是2的整數次冪,二進制距離

code false 無法 計算 個數 urn 其他 return elf

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

class Solution:
    def NumberOf1(self, n):
        """
        給定一個數n,將n和(n-1)做位與運算可以將最後一個1變成0.
        假設n的最後一個1在第m位,則將n-1之後,第m位由1->0,第m位以後的位全部取反,
        第m位以前的位保持不變。因此我們得到一個結論:n & (n-1)可以將n的最後一個1變成0。

        當給定的數字是正數的時候,我們可以直接按照上面的結論去計算二進制中1的個數。
        但是如果給定的數字是復數的話,當n變成除了符號位,其它都為0的時候,n-1會保持符號位不變,
        將其他位取反,導致循環無法終止。
        考慮32位整數,如果是復數,符號位為1111,那麽我需要將最高位符號位置為0來確保循環得到終止,
        因此將n &= 0x7fffffff,並將num+=1,因為最高位符號位是1,已被我們置為0
        """
        num = 0
        # 將符號位置為0,註意這裏num += 1
        if n < 0:
            n &= 0x7fffffff
            num += 1
        # n & (n-1)可以將n的最後一個1變成0
        while n != 0:  # 將一個數減去1
            num += 1
            n = (n - 1) & n

        return num

    def isPowOf2(self, n):
        """
        給定一個整數n,判斷是否是2的整數次冪
        """
        if n <= 0:
            return False
        n &= n - 1  # 如果n是2的整數次冪,那麽二進制中只有1個1,去掉之後n變為0
        return n == 0

    def binaryDistance(self, n, m):
        """
        給定n和m,需要改變n的多少位才能得到m
        """
        dist = n ^ m
        num = 0
        if dist < 0:
            num += 1
            dist &= 0x7fffffff

        while dist != 0:
            dist &= dist - 1
            num += 1

        return num

劍指offer:二進制中1的個數,判斷是否是2的整數次冪,二進制距離