计算一个二进制数里面有多少个 1

方法1:逐位与

unsigned int countBits(unsigned long long n){
  //your code here
  unsigned int cnt = 0;
  while(n){
    cnt += n & 1;
    n >>= 1;
  }
  return cnt;
}

self adding

动机是减少循环次数,可不可以只数 1,不管 0。 一个数减去 1 的话,它的最末一个 1,以及之后的所有 0,全部变反,前面的位不变。因此要消除最末一个 1,可以把一个数减一再与自己。这样一次消除一个 1,消除到 0 就停止循环。因此可以减少循环次数到 1 的个数。

unsigned int countBits(unsigned long long n){
  //your code here
  unsigned int cnt = 0;
  while(n){
    n = n & (n-1);
    cnt++;
  }
  return cnt;
}

https://www.dazhuanlan.com/2019-12-07