實(shí)現(xiàn)一個函數(shù),輸入一個無符號整數(shù),輸出該數(shù)二進(jìn)制中的1的個數(shù)。例如把9表示成二進(jìn)制是1001,有2位是1,因此如果輸入9,該函數(shù)輸出2.
常規(guī)解法
func countPositionNumber(number:Int) -> Int {
var num:Int = number
var count = 0
while num != 0 {
if num%2 == 1 {
count += 1
}
num = num/2
}
return count
}
func countPositionNumber1(number:Int) -> Int {
var num:Int = number
var count = 0
while num != 0 {
if (num & 1) == 1 {
count += 1
}
num = num >> 1
}
return count
}
優(yōu)化解法
上面的兩種函數(shù)只能滿足正整數(shù)的1的個數(shù),我們可以不斷移位1,判斷1的個數(shù),包含負(fù)整數(shù):
func countPositionNumber2(number:Int) -> Int {
let num:Int = number
var flag = 1
var count = 0
while flag > 0 {
if (num & flag) > 0 {
count += 1
}
flag = flag << 1
}
return count
}
最優(yōu)解
將一個整數(shù)減1然后和原來的整數(shù)做位與運(yùn)算,相當(dāng)于原有的二進(jìn)制數(shù)最右邊的1變?yōu)?.
func countPositionNumber3(number:Int) -> Int {
var num:Int = number
var count:Int = 0
while num > 0 {
count += 1
num = num & (num-1)
}
return count
}
測試代碼:
let count:Int = self.countPositionNumber(number: 0xFFFFFFFF)
print("FlyElephant-數(shù)字中1的個數(shù):\(count)")
let count1:Int = self.countPositionNumber1(number: 0xFFFFFFFF)
print("FlyElephant---數(shù)字中1的個數(shù):\(count1)")
//0xFFFFFFFF
let count2:Int = self.countPositionNumber2(number: 0xFFFFFFFF)
print("FlyElephant---數(shù)字中1的個數(shù):\(count2)")
let count3:Int = self.countPositionNumber2(number: 0xFFFFFFFF)
print("FlyElephant---數(shù)字中1的個數(shù):\(count3)")