實現一個函數须尚,輸入一個無符號整數崖堤,輸出該數二進制中的1的個數。例如把9表示成二進制是1001耐床,有2位是1密幔,因此如果輸入9,該函數輸出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)化解法
上面的兩種函數只能滿足正整數的1的個數撩轰,我們可以不斷移位1胯甩,判斷1的個數昧廷,包含負整數:
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)解
將一個整數減1然后和原來的整數做位與運算,相當于原有的二進制數最右邊的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-數字中1的個數:\(count)")
let count1:Int = self.countPositionNumber1(number: 0xFFFFFFFF)
print("FlyElephant---數字中1的個數:\(count1)")
//0xFFFFFFFF
let count2:Int = self.countPositionNumber2(number: 0xFFFFFFFF)
print("FlyElephant---數字中1的個數:\(count2)")
let count3:Int = self.countPositionNumber2(number: 0xFFFFFFFF)
print("FlyElephant---數字中1的個數:\(count3)")