劍指offer算法題【14】:二進制中1的個數(位運算)

題目

輸入一個整數,輸出該數二進制表示中1的個數。

容易引起死循環的解法

 def solution1(self,n):
        count = 0 # 用於計算1的個數
        while n: # 只要還不等於0
            if (n & 1): # 如果n和1相與爲1,代表最低位爲1,其中&表示位運算
                count+=1
            n = n >> 1 # 右移一位使得原來的第二位變成現在的第一位
        # 這種方式爲什麼會引起死循環,因爲當n爲負數的時候,顯然最左邊會補1,這種情況下根本就沒辦法停止循環
        return count

常規解法 

    def solution2(self,n):
        count = 0
        flag = 1 # 上一個方法是移動數字n,這次我們移動數字1即可。
        while flag:
            if (n & flag): # 若位運算結果爲1,則那一位爲1
                count += 1
            flag = flag << 1 # 將1左移一位
        return count

會給面試官帶來驚喜的解法

一個整數減去1,可以將其最右邊第一個1一直到最右邊爲止的所有數位取反。如:
1011−1=1010 

1100−1=1001 

利用這個性質,原數和減去1之後的數做與運算,則可以去掉原數最右邊的一個1,有多少個1就可以做多少次這樣的運算。

 def solution3(self,n):
        count = 0
        while n:
            count += 1
            n = n & n-1
        return count

 

發佈了234 篇原創文章 · 獲贊 71 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章