牛客網鏈接
輸入一個整數讯赏,輸出該數二進制表示中1的個數垮兑。其中負數用補碼表示。
解法1(不考慮負數的情況)
每次檢查n的最低位是否為1漱挎,進而更新1的個數系枪,之后將n右移。但是對于負數磕谅,在右移的過程中將會在最左端補符號位1(正數補零)私爷,將造成死循環(huán),因此該算法不可行(Python中對bin(-1)得到的不是-1的補碼膊夹,而是-0b1
(即在1的原碼之前加負號衬浑,便于閱讀...后面會進行詳細的解釋))
class Solution:
def NumberOf1(self, n):
count = 0
while n :
if n & 1:
count+=1
n >>= 1
return count
解法2
flag置為1,每次左移flag,來判斷相應位是否為1
(因為python會在int過大時自動將int轉為long,因為我們需要使用python中的c語言類型)
class Solution:
def NumberOf1(self, n):
flag = 1
count = 0
# 將flag轉為c語言中的int類型(flag經過移位之后將超過C語言中最大整數將會得到0放刨,退出循環(huán))
while c_int(flag) :
if n & flag:
count+=1
flag <<= 1
return count
解法3
如果數字不為0工秩,說明存在為1的值,進行n&(n-1)運算,將會得到去掉最低位1之后的結果
例如
n = 01100
助币,則n-1=01011
浪听,兩者按位與n&(n-1)=01000
,即為n去掉最后一個1之后的結果
因為bin(-1)將得到-0b1奠支,我們這里期望得到-1的補碼
因此需要先將n&0xffffffff得到數字對應的補碼(在Python中馋辈,負數和0xffffffff按位與之后變成一個無符號數,二進制表示為編碼形式)
class Solution:
def NumberOf1(self, n):
print(bin(n))
# write code here
count = 0
n &= 0xffffffff
while n:
n = n&(n-1)
count+=1
return count