二进制中1的个数

二进制中1的个数

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

sample input:
10
sample output:
2

常规解法:

十进制转二进制,遍历计算二进制中1的个数。

int solve(int n){
      int cnt=0;
      while(n){
            if(n%2) cnt++;
            n/=2;      
      }
      return cnt;
}

这种方法,对于大部分数据是对的,但是对于-2147483648,二进制为1000...000,一共有31个0.因为计算机使用补码存储二进制数据的。对于这个数据,该程序输出0,实际上为1.所以这种方法不对。

二进制移位法(有问题)

int solve(int n){
      int cnt = 0;
      while(n){
            if(n&1) cnt++;
            n >>= 1;
      }
      return cnt;
}

二进制思想:

对于一个数n和n-1对应二进制中,n的高位向低位最后一个1(低位向高位第一个1),在减1后,这个1变为0,之前的位不变,之后的位0->1,1->0.n&(n-1)按位与后,1前面的不变,后面的全变为0.
通过按位与我们可以很好地通过循环计算1的个数。而且不用判断0,会在n&(n-1)的过程中自动忽略,不需要按照位来遍历判断。

int solve(int n){
      int cnt=0;
      while(n){
            cnt++;
            n &=(n-1);
      }
      return cnt;
}
T(时间复杂度):O(n)
S(空间复杂度):O(1)
posted @ 2021-02-03 16:49  流转~星云  阅读(203)  评论(0编辑  收藏  举报