实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2.
常规解法
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
}
优化解法
上面的两种函数只能满足正整数的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
}
最优解
将一个整数减1然后和原来的整数做位与运算,相当于原有的二进制数最右边的1变为0.
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)")