1. 程式人生 > >求一個數被置為1的bit數目

求一個數被置為1的bit數目

程式設計中經常遇到用一個數的每個bit表示一個狀態,有時需要計算被置為1的bit數目。

方法1. 最直接的方法就是一位一位的判斷

U8 nonZeroBitNum(U32 x) {

U8 num = 0;

for(U8 i = 0; i++; i<32)

        num += (x>>i) & 1;  // 右移,與,加 運算,需要三個CPU指令週期

return num;

}

這種方法邏輯簡單,但是每個32位數都需要迴圈32次得出結果

方法2. 利用 (2^N - 1) & 2^N = 0的原理對方法1進行優化

一個無符號數32位數可以表示為,bit31*2^31 + bit30*2^30 + .... + bit1*2^1 + bit0*2^0

U8 nonZeroBitNum(U32 x) {

U8 num = 0;

while(x){

    x &= x-1; // 減,與 運算,需要2個CPU指令週期

    num++; // ++運算,1個CPU指令週期

}

return num;

}

可以看出方法2迴圈內的運算複雜度與方法1是相同的,考慮到不是所有資料的所有bit都是1,假設所有資料平均有16 bit會被置為1,那麼這種方法只需要迴圈16次既可以算出結果,比方法1節省了1半的時間。如果大部分資料只有少數bit被置為1,那麼效率的提升就更明顯了。

雖然只是個小技巧,但是覺得還是挺有意思的。如果誰有更好的方法,也可以分享一下。