劍指offer:二進制中1的個數,判斷是否是2的整數次冪,二進制距離
阿新 • • 發佈:2019-04-19
code false 無法 計算 個數 urn 其他 return elf 題目描述
輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。
輸入一個整數,輸出該數二進制表示中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的整數次冪,二進制距離