練習統計正整數中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都是用了這個思想,好強大的思想。