p1001

1.求int型数据在内存中存储时1的个数
输入一个int型数据,计算出该int型数据在内存中存储时1的个数。

我们很容易想到如下方法:

[cpp]  view plain  copy
 print ?
  1. #include <iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     int n,cnt=0;  
  6.     cin>>n;  
  7.     while(n)  
  8.     {  
  9.         if(n%2==1)  
  10.             cnt++;  
  11.         n=n/2;  
  12.     }  
  13.     cout<<cnt<<endl;  
  14.   
  15.     return 0;  
  16. }  


在对代码进行测试时输入负数无法得出结论,下面的方法将解决这一问题。

[cpp]  view plain  copy
 print ?
  1. #include <iostream>  
  2. using namespace std;  
  3. int GetCount(int n)  
  4. {  
  5.     int m=0;  
  6.     while(n)  
  7.     {  
  8.         n&=(n-1);  
  9.         m++;  
  10.     }  
  11.     return m;  
  12. }  
  13. int main()  
  14. {  
  15.     int a;  
  16.     cin>>a;  
  17.     cout<<GetCount(a)<<endl;  
  18. }  


如果我们把这个整数减去1,那么原来处在整数最右边的1就会变成0,原来在1后面的所有 的0都会变成1。其余的所有位将不受到影响。举个例子:一个二进制数1100,从右边数起的第三位是处于最右边的一个1。减去1后,第三位变成0,它后面 的两位0变成1,而前面的1保持不变,因此得到结果是1011。


我们发现减1的结果是把从最右边一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位 开始所有位都会变成0。如1100&1011=1000。也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么 一个整数的二进制有多少个1,就可以进行多少次这样的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值