p1001

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

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

[cpp]  view plain  copy
 print ?
  1. #include   
  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<
  14.   
  15.     return 0;  
  16. }  


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

[cpp]  view plain  copy
 print ?
  1. #include   
  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<
  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,就可以进行多少次这样的操作。

你可能感兴趣的:(华为oj)