請實現(xiàn)一個函數(shù),輸入一個整數(shù)(以二進制串形式),輸出該數(shù)二進制表示中 1 的個數(shù)。例如,把 9 表示成二進制是 1001,有 2 位是 1。因此,如果輸入 9,則該函數(shù)輸出 2。
根據(jù)位運算的方式, 0 或者 1 & 1得到的結(jié)果和原來的數(shù)一致,我們可以通過不斷的左移數(shù)字n,根據(jù)最右位上 & 1,判斷是否是1。
右移n算法:
func hammingWeight(_ n: Int) -> Int {
var n = n
var res = 0
while n != 0 {
if n & 1 == 1 {
res += 1
}
n = n >> 1
}
return res
}
算法二: n&(n-1)
- (n?1) : 二進制數(shù)字 n 最右邊的數(shù)如果是 1 則變成 0,其它不變 。如果是0,則 n 最右邊的1的變成0,1 右邊的 0 都變成 1 。1001 - 1 = 1000, 1100 - 1 = 1011。
- n&(n?1) : 二進制數(shù)字 n 最右邊的 1 變成 0 ,其余不變。1001 & 1000 = 1000,1100 & 1011 = 1000。
func hammingWeight(_ n: Int) -> Int{
var n = n
var res = 0
while n != 0{
res += 1
n &= n - 1
}
return res
}
算法的時間復(fù)雜度: O(M),其中M表示二進制數(shù)字 n 中 1 的個數(shù),則需循環(huán) M 次(每輪消去一個 1 )。