题目:
实现一个函数,输入一个整数,输出该数二进制表示中1的个数。如9的二进制是1001,因此输入9输出2。
解法一:常规解法耗时
int num1(int n)
{
int count =0;
while(n)
{
if(n%2==1) count++;
n=n/2;
}
return count;
}
解法二:位操作可能死循环
int num1(int n)
{
int count =0;
while(n)
{
if(n&1) count++;
n=n>>1;
}
return count;
}
上面的函数如果输入一个负数,如果一直做右一运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环。
解法三:无死循环但效率低
int num1(int n)
{
int count =0;
unsigned int flag=1;
while(flag)
{
if(n&flag) count++;
flag=flag<<1;
}
return count;
}
循环次数等于整数二进制的位数,32位的整数需要循环32次。
解法四:有几个1只需要循环几次
int num1(int n)
{
int count =0;
while(n)
{
++count;
n=(n-1)&n;
}
return count;
}
解法五:查表法O(1)复杂度
这是个典型的空间换时间的算法,把0-255中1的个数直接存储在数组中,时间复杂度为O(1)。