Write a function that takes an unsigned integer and returns the number of ’1‘ bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11‘ has binary representation 00000000000000000000000000001011
, so the function should return 3.
思路1:向右移位,判断最后一位即可。
思路2:
n & (n - 1) drops the lowest set bit. It‘s a neat little bit trick.
Let‘s use n = 00101100 as an example. This binary representation has three 1s.
If n = 00101100, then n - 1 = 00101011, so n & (n - 1) = 00101100 & 00101011 = 00101000. Count = 1.
If n = 00101000, then n - 1 = 00100111, so n & (n - 1) = 00101000 & 00100111 = 00100000. Count = 2.
If n = 00100000, then n - 1 = 00011111, so n & (n - 1) = 00100000 & 00011111 = 00000000. Count = 3.
n is now zero, so the while loop ends, and the final count (the numbers of set bits) is returned.
int hammingWeight(int n) { int weight = 0; while(n != 0) { if(n & 1 == 1)weight++; n>>=1; } return weight; } int hammingWeight(uint32_t n) { int count = 0; while (n) { n &= (n - 1); count++; } return count; }
参考:
https://discuss.leetcode.com/topic/20120/c-solution-n-n-1