给出一个整数,输出它的二进制表示中1的个数。
测试用例:
正数:边界值1,0x7FFFFFFF
负数:边界值0x80000000,0xFFFFFFFF
零:0
int numbersof1_1(int num)
{
int sum=0;
while(num)
{
if(num&1)
++sum;
num>>=1;
}
return sum;
}
上面的解法可能引起死循环,对于负数,因为负数右移是删除二进制右边一位,然后左边加1,最后导致0xFFFFFFFF的死循环。另外,位运算就是相当于乘以2,除以2的运算,但是位运算的效率高于乘法运算。
int numbersof1_2(int num)
{
int sum=0;
int f=1;
while(f)
{
if(num&f)
++sum;
f<<=1;
}
return sum;
}
这是常规解法,通过对1左位移,避免了对整数的操作引起死循环,在循环了32次或64次(根据电脑位数决定)后循环结束。
int numbersof1_3(int num)
{
int sum=0;
while(n)
{
num=num&(num-1);
++sum;
}
return sum;
}
上面的是较优解法,举例说明,对于数1100,将它减1,得到1011,发现最右边的1变为了0,如果原来后边存在0,则全变为1,再将1011和它本身1100做与运算得到1000,发现相较于原数,最右边的1变为了0,记录下来,令sum++,知道整数为0结束。