1.循環法(Iterated Count)
int bitcount (unsigned int n)
{
int count=0;
while (n) {
count += n & 0x1u ;
n >>= 1 ;
}
return count ;
}
最容易理解和想到的方法。對每一位依次判斷是否爲1,如果是就在count上加1。
循環的次數是常數(n的位數)。在1比較稀疏的時候效率低,可用方法2改進。
2.Bit1稀疏Sparse Ones
int bitcount (unsigned int n)
{
int count=0 ;
while (n) {
count++ ;
n &= (n - 1) ;
}
return count ;
}
理解這個算法的核心,只需理解2個操作:
1> 當一個數被減1時,他最右邊的那個值爲1的Bit將變爲0,同時其右邊的所有的Bit都會變成1。2>“&=”,位與並賦值操作。去掉已經被計數過的1,並將改值重新設置給n.
這個算法循環的次數是bit位爲一的個數。也就說有幾個Bit爲1,循環幾次。對Bit爲1比較稀疏的數來說,性能很好。如:0x1000 0000, 循環一次就可以。