整数二进制展开中数位1的总数
前言
目前在,额,怎么说呢,回炉重造数据结构,今天在邓俊辉老师的书上看到了一个很有意思的算法,第一遍没看明白,后面仔细想了一下才搞明白什么意思,觉得很有趣,记录一下。
这个算法如题所言,统计整数二进制展开中数位1的总数
,网上常见的算法是通过将数n二进制展开中的最低位1转置0来统计,此算法本文也会介绍(说是介绍其实是抄书啦),然邓老师书上又介绍了一个更有趣的算法,这个会介绍本人的见解。
设输入一个数n,位宽W=log n.
1.第一种算法
先上代码
0001 int countOnes1 ( unsigned int n ) { //统计整数二进制展开中数位1的总数:O(ones)正比于数位1的总数
0002 int ones = 0; //计数器复位
0003 while ( 0 < n ) { //在n缩减至0之前,反复地
0004 ones++; //计数(至少有一位为1)
0005 n &= n - 1; //清除当前最靠右的1
0006 }
0007 return ones; //返回计数
0008</