二进制中1的个数

题:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

方法一:把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变为0。如,1100,其第二位是从最右边数起的第一个1,见1以后变为1011,即第二位左边的1保持不变,右边的从0变为1,与原先的数1100做与运算,结果为1000,结果中,刚好少一个1。代码如下:

 1 class Solution {
 2 public:
 3      int  NumberOf1(int n) 
 4      {
 5          int count=0;
 6          while(n)
 7          {
 8              ++count;
 9              n=(n-1)&n;
10          }
11          return count;
12      }
13 };

方法二:首先判断n和1做与运算,判断n的最低位是不是为1,接着把1左移一位得到2,再和n做与运算,判断n的次低位是不是1,依次左移。代码如下:

 1 class Solution {
 2 public:
 3      int  NumberOf1(int n) 
 4      {
 5          int count=0;
 6          unsigned int flag=1;
 7          while(flag)
 8          {
 9              if(n&flag)
10                  ++count;
11              flag=flag<<1;
12          }
13          return count;
14      }
15 };

这种做法,每次跳出循环时,循环了整数的二进制的位数,如,32为的整数则需要循环32次,相对而言第一种方法好。

另外不能采用移动输入的数n的方法,会造成死循环。

 

posted @ 2017-08-16 10:45  王大咩的图书馆  阅读(328)  评论(0编辑  收藏  举报