法一

  • 每次把二进制最右边的1提取出来,计数++
  • 然后异或把这个最右边的1消掉,继续循环
  • 怎么提取二进制最右边的1?
    • n & ((~n) + 1)
    • 也可以写成n & (-n)

image.png

  1. public int hammingWeight(int n) {
  2. int res = 0;
  3. while (n != 0) {
  4. res++;
  5. int rightOne = n & (-n);
  6. n ^= rightOne;
  7. }
  8. return res;
  9. }

法二

  1. public int hammingWeight(int n) {
  2. int res = 0;
  3. for (int i = 0; i < 32; i++) {
  4. if ((n & (1 << i)) == 1) {
  5. res++;
  6. }
  7. }
  8. return res;
  9. }