位操作

最近看了一下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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值