/*对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法执行效率尽可能地高。
*/
#include<stdio.h>
#include<stdlib.h>
void test1()
{
printf("请输入一个整数:");
int a=0;
scanf("%d",&a);
setbuf(stdin,NULL);
int num=0;
int tmp=a;
while(a)
{
if(a&0x1)
num++;
a=a>>1;//右移一位
}
printf("%d有%d位为1\n",tmp,num);
}
int test2()
{
printf("请输入一个整数:");
int a=0;
scanf("%d",&a);
setbuf(stdin,NULL);
int num=0;
int tmp=a;
while (a)
{
a &=(a-1); //v=v&(v-1)这个操作可以直接消除掉v中的最右边的1。
//1001
//1000
//1000 //1位
//1000
//0111
//0000 //1位
//结果 2位
num++;
}
printf("%d有%d位为1\n",tmp,num);
return num;
}
int main(void)
{
test2();
return 0;
}