Counting 1-bits

練習統計正整數中1的個數。兩個經典的算法

 

int OneNum_MnsOne(unsigned int aInt){
    int num=0;

    while(aInt != 0){
        num++;
        aInt = aInt & (aInt - 1);
    }
    return num;
}

int OneNum_DvdCnq(unsigned int aInt){

    //每兩位統計1的個數。
    aInt = (aInt & 0x55555555) + ((aInt>>1) & 0x55555555);
    //剩下的工作就是把這些統計後的1個數相加得到所有1的個數。先是兩位兩位的加
    aInt = (aInt & 0x33333333) + ((aInt>>2) & 0x33333333);
    //四位四位的加
    aInt = (aInt & 0x0F0F0F0F) + ((aInt>>4) & 0x0F0F0F0F);
    //八位八位的加
    aInt = (aInt & 0x00FF00FF) + ((aInt>>8) & 0x00FF00FF);
    //16位16位的加就得到結果
    aInt = (aInt & 0x0000FFFF) + ((aInt>>16) & 0x0000FFFF);

    return aInt;
}

 

後一個算法在<<Hacker's Delight>>中講了,想到這算法的人太牛了!書上用圖說明了一個例子,看了這個圖就明白很多了:

 

這個算法用“Dividing and Conquer”思想,其它像二分法,quicksort都是用了這個思想,好強大的思想。

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