計算一個無符整數中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, 循環一次就可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章