`

Count the number of set bits in an integer

 
阅读更多

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;
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics