【位操作筆記】位計數演算法 分治法統計 4 另外一個版本

dadalaohua發表於2020-12-23

位計數演算法 分治法統計 4 另外一個版本

位計數

位計數(Counting bits set),指的是計算一個數裡bit位置1的個數,例如一個8位數0xea = 0b1110 1010,位置1的個數為5。

演算法說明

該演算法是基於分治法(divide and conquer)的一個優化後的演算法版本,分治法是指以兩個相鄰的bit位為一組,將這兩個bit的數值相加,得到的結果放到大小為2bit的位段空間裡。然後再將相鄰的兩個2bit位段數值相加,得到的結果放到4bit的位段空間裡,以此類推,最終完成位計數。分治法可以參照位計數演算法 分治法統計位計數演算法 分治法統計 優化版本

位計數程式碼

32位數的位計數程式碼

unsigned int count(unsigned int x)
{
    x = x - ((x >> 1) & 0x55555555);                      // reuse input as temporary
    x = (x & 0x33333333) + ((x >> 2) & 0x33333333);       // temp
    x = (((x + (x >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24; // count
    
    return x;
}

演算法來源

Bit Twiddling Hacks By Sean Eron Anderson Counting bits set, in parallel

演算法計算過程

省略,原理相同,可以參照位計數演算法 分治法統計 優化版本

位計數程式碼

[參考資料]

[Hacker’s Delight] 作者: Henry S. Warren Jr.

Bit Twiddling Hacks By Sean Eron Anderson

相關文章