位操作
来源:互联网 发布:300451创业软件股吧 编辑:程序博客网 时间:2024/06/05 14:32
最近看了一下c中位运算的知识,写了几个小的测试程序,有的地方不是很明白
统计一个整数中1的个数:
int count_1(int a) 26 { 27 /* 28 int i ,j,k; 29 int sum = 0;//和清零 30 for(i=0;i<32;i++)//每次移动的位数 31 { 32 j=1;//j=0000 0000 0000 0000 0000 0000 0000 0001 33 int x = j<<i;//开始左移 比如i=2时:0000 0000 0000 0000 0000 0000 0000 0100 34 k = a&x;//a与x按位与 看看结果是否是1 35 if(k==0)//如果k是0,那么跳过本次,继续下一次循环 36 continue; 37 else//如果k !=0 38 { 39 int c = k>>i;//k右移i位 那么c ==1 40 sum += c;//计算sum的值 41 } 42 } 45 return sum;*/返回1的个数 46 //第二种方法 47 int count = 0;//初始化个数为0 48 while(a)//只要a!= 0 49 { 50 a &= (a-1);//依次清除a最右边的1,直到a == 0 51 count++;//count++ 52 } 53 return count;//返回a中1的个数 54 }
测试的时候,第一种有的数测试不正确,第二种方法感觉还可以。不知道第一种哪里有问题
第一种测试的数据比如 8,127,255,256都正确,但是测试34520时,不正确,正确结果应该是7个1,但是测试却是5;
0 0