題目
輸入一個整數,輸出該數二進制表示中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