计算二进制‘1’位数

/*对于一个字节(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;
}

posted @ 2015-11-05 19:42  cloudren2020  阅读(139)  评论(0编辑  收藏  举报