1. 程式人生 > >計算一個無符整數中bit位為1的個數

計算一個無符整數中bit位為1的個數

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改進。

2Bit1稀疏Sparse Ones

int bitcount (unsigned int n)
{
int count=0 ;
while (n)  {
count++ ;
n &= (n - 1) ;
}
return count ;
}

理解這個演算法的核心,只需理解2個操作:

1> 當一個數被減1時,他最右邊的那個值為1Bit將變為0,同時其右邊的所有的Bit都會變成1
2>“&=”,位與並賦值操作。去掉已經被計數過的1,並將改值重新設定給n.

這個演算法迴圈的次數是bit位為一的個數。也就說有幾個Bit1,迴圈幾次。對Bit1比較稀疏的數來說,效能很好。如:0x1000 0000, 迴圈一次就可以。