练习统计正整数中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都是用了这个思想,好强大的思想。