Question: Count the number of set bits in an 32 integer.
Method 1:
Count the bit one by one, 这显然不好:
public int bitCount(int a) {
int num = 0;
for (int i=0; i<32; ++i) {
if ((a & (1<<i)) != 0)
num++;
}
return num;
}
Method 2:
仅查被set的位。
public int bitCount(int n) {
int count = 0;
while(n != 0){
count++;
n &= n-1;
}
return count;
}
Method 3:
注意Java里面要用>>>,代表把符号一块儿右移。
public int bitCount(int a) {
a = ((0xAAAAAAAA & a)>>>1) + (0x55555555 & a);
a = ((0xCCCCCCCC & a)>>>2) + (0x33333333 & a);
a = ((0xF0F0F0F0 & a)>>>4) + (0x0F0F0F0F & a);
a = ((0xFF00FF00 & a)>>>8) + (0x00FF00FF & a);
a = ((0xFFFF0000 & a)>>>16) + (0x0000FFFF & a);
return a;
}
Method 4:
上面的方法还可以改进为下面这样,方便好记。
public int bitCount(int n) {
n = (n & 0x55555555) + ((n>>>1) & 0x55555555);
n = (n & 0x33333333) + ((n>>>2) & 0x33333333);
n = (n & 0x0F0F0F0F) + ((n>>>4) & 0x0F0F0F0F);
n = (n & 0x00FF00FF) + ((n>>>8) & 0x00FF00FF);
n = (n & 0x0000FFFF) + ((n>>>16) & 0x0000FFFF);
return n;
}
Method 5:
Hacker's Delight里的方法,也是Java源码的实现方法。
public int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}