对于一个数字,无符号,求其二进制表示中的1个数,要求算法执行效率尽可能高。
解法一:考虑利用整数除法的特点,通过相除和求余来分析。
void fun1(int num)
{
int ct=0;
while (num)
{
if (num%2==1)
{
ct++;
}
num/=2;
}
cout<<ct<<endl;
}
解法二、使用位操作 假设该数是一个无符号整型八位字节表示的数字,通过该数与0x01相与,得出最后一位数字是0或者是1,若是零,与后结果为0,若是1,与后结果为1.
int ct=0;
while (num)
{
ct+=num&0x01;
num>>=1;
}
cout<<ct<<endl;
解法三、任意一个数字x,当他与x-1相与之后,x的结果相比原来就少了一个1,一直循环下去,直到结果为0为止
int ct=0;
while (num)
{
ct++;
num&=(num-1);
}
cout<<ct<<endl;
解法四、只有八位二进制数字的话,直接把0-255内的所有情况都罗列出来,使用case语句。
int num;
switch(num)
{
case 0x0:
num=0;
break;
case 0x1:
case 0x2:
.........
case 0x80:
num=1;
break;
.....
.....
}
cout<<num<<endl
解法五、查表法
预定义的结果表:
int result[256]={
0,1,1,2,1,.........................
};
return result[num];
附加:
给定两个正整数,求其二进制表示中不同位有多少?
int fun(int a,int b)
{
int num=0;
while (a||b)
{
if (a%2!=b%2)
{
num++;
}
a/=2;
b/=2;
}
return num;
}