二进制数中1的个数
一、题目
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
二、解决方案
1. 避免死循环的位操作
时间复杂度为O(log2n)。
用位操作优于除法,考虑负数,比如n = 0x800000000,循环右移n可能会引起死循环。因此,可以循环左移1和n做与运算避免死循环。
/* 避免死循环的位操作 */
int NumberOf1_Solution1(int n)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (n & flag)
++count; //效率比count好
flag <<= 1;
}
return count;
}
2. 位操作
时间复杂度为O(M),其中M为n中1的个数。
将n与(n-1)进行与运算,会把该数最右边的1变成0。那么1有多少个,就可以进行多少次与操作。
/* 最优的位操作 */
int NumberOf1_Solution2(int n)
{
int count = 0;
while (n)
{
++count;
n &= (n-1);
}
return count;
}
作者:yusq77
-------------------------------------------
Wish you all the best and good health in 2021.