问题:对于一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。
源代码如下
#include<iostream>
using namespace std;
#define BYTE unsigned char
int Cout1(BYTE v)
{
int num = 0;
while(v)
{
if(v % 2 == 1)
{
num++;
}
v = v / 2;
}
return num;
}
int Cout2(BYTE v)
{
int num = 0;
while(v)
{
num += v & 0X01;
v >>=1;
}
return num;
}
int Cout3(BYTE v)
{
int num = 0;
while(v)
{
v &= (v-1);
num++;
}
return num;
}
/*int Count4(BYTE v)
{
int num = 0;
switch(v)
{
case 0x0:
num = 0;
break;
case 0x1:
case 0x2:
case 0x4:
case 0x8:
case 0x10:
case 0x20:
case 0x40:
case 0x80:
num = 1;
break;
case 0x3:
case 0x6:
case 0xc:
case 0x18:
case 0x30:
case 0x60:
case 0xc0:
num = 2;
break;
//.......
}
return num;
}*/
int countTable[256] =
{
0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,
3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,
3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,
4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,
3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,
2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,
4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,
5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,
5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
};
int Count5(BYTE v)
{
return countTable[v];
}
int main()
{
int num_of_1 = 0;
BYTE byte = 10100010;
num_of_1 = Count5(byte);//可以选择不同方法,结果一样。
cout << num_of_1 << endl;
}
扩展问题:
1.如果变量是32位的DWORD,我会选择Count3(BYTE v)算法。
2.给定两个正整数(二进制形式表示)A和B,把A变为B需要改变A^B位。