【来源】:编程之美 P119
求一个8位无符号整型变量的二进制形式中“1”的个数,要求算法尽可能效率高。
一个整数的二进制形式中除了“0” 就是“1”;如何计算“1”的个数,可以联想到计算机组成原理中的除法运算的实质,除法运算实质就是右移一位二进制。
先将整数写成二进制形式,然后判断最后一位是否是“1”,若是,则计数器加一,否则,继续,然后右移一位,直到判断所有的数位。
判断最后一位是否是“1“,直接联想到的就是采用与操作,将其与0x01与操作,判断其结果,若为”1“,则最后一位是”1“,否则是”0“
这是一种判断方法,想一想,右移一位,相当于除以2,因此可用除法代替,让整型的数除以2,若余数为1,则说明该数的二进制形式结尾是”1",,否则说明二进制形式结尾是“0”
测试代码如下:
#include <iostream>
using namespace std;
int Count1(int v)
{
//除法形式判断最后一位
int num = 0;
while(v)
{
if(v%2==1)
{
num ++;
}
v = v/2;
}
return num;
}
int Count2(int v)
{
//采用移位方式判断最后一位
int num =0;
while(v)
{
num += v&0x01;
v>>=1;
}
return num;
}
int main()
{
int v;
v=3;
cout<<"num of "<<v<<"is "<<Count2(v)<<endl;
return 0;
}