比方说数11,用二进制表示是1011 其中1的个数是3. 此题的求解方法有好多种,参考此文章http://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html 这篇文章中有好多种算法,值得一读。这里主要再分析一下完美法的算法。算法代码如下:
int bitcount(unsigned int n)
{
unsigned int tmp = n - ((n >> 1) & 033333333333) - ((n >> 2) & 011111111111);
return ((tmp + (tmp >> 3)) & 030707070707) % 63;
}
这几行代码容量很大,上面的那篇文章也对此代码进行了一些讲解。这里再补充一些解释:
第一行tmp中的内容就是将n的二进制表示写出来,然后每3bit分成一组,求出每一组中1的个数,再表示成二进制的形式。
第二行中(tmp + (tmp >> 3)) & 030707070707 的作用是将tmp的二进制按6位来分组,每组中前三位加到后三位中,并将前三位都置零。
最后一步,得到二进制表示 t6t5t4t3t2t1, 其中每个t1这样的都表示6位2进制数(这6位二进制数表示的值是这原始六位数中1的个数)。所以它的值是
( 64^5*t6+64^4*t5+64^3*t4+64^2*t3+64*t2+t1 ) mod 63 = t6+t5+t4+t3+t2+t1 即为32位中1的个数和。这其中有一个知识点,就是64%63=1,(64*64)%63=1,(64*64*64)%63=1...
请举实际例子加以理解。