高手给解释解释这个算法
这是一个求一个32位无符号整型二进制形式的1的个数
int Count(unsigned x) { x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; x = x + (x >> 8); x = x + (x >> 16); return x & 0x0000003F; } 这里用的是二分法,两两一组相加,之后四个四个一组相加,接着八个八个,最后就得到各位之和了。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bvbook/archive/2008/04/15/2292823.aspxx = (x + (x >> 4)) & 0x0F0F0F0F; x = x + (x >> 8); x = x + (x >> 16);
[解决办法]
小妹不是高手,冒充一次高手,随便推了下:
为了好说明,我把这个32位的数设为:0111 1111 1111 1111 1111 1111 1111 1111
下面是我的推导的过程:
0111 1111 1111 1111 1111 1111 1111 1111->初始状态
0011 1111 1111 1111 1111 1111 1111 1111->x>>1
0101 0101 0101 0101 0101 0101 0101 0101->0x55555555
0001 0101 0101 0101 0101 0101 0101 0101->(x >> 1) & 0x55555555
0111 1111 1111 1111 1111 1111 1111 1111
0001 0101 0101 0101 0101 0101 0101 0101->(x >> 1) & 0x55555555
0110 1010 1010 1010 1010 1010 1010 1010->x - ((x >> 1) & 0x55555555);
0110 1010 1010 1010 1010 1010 1010 1010
0011 0011 0011 0011 0011 0011 0011 0011->0x33333333
0010 0010 0010 0010 0010 0010 0010 0010->(x & 0x33333333)
0110 1010 1010 1010 1010 1010 1010 1010
0001 1010 1010 1010 1010 1010 1010 1010->x>>2
0011 0011 0011 0011 0011 0011 0011 0011->0x33333333
0001 0010 0010 0010 0010 0010 0010 0010->((x >> 2) & 0x33333333);
0010 0010 0010 0010 0010 0010 0010 0010->(x & 0x33333333)
0001 0010 0010 0010 0010 0010 0010 0010->((x >> 2) & 0x33333333);
0011 0100 0100 0100 0100 0100 0100 0100->(x & 0x33333333) + ((x >> 2) & 0x33333333);
0011 0100 0100 0100 0100 0100 0100 0100
0000 0011 0100 0100 0100 0100 0100 0100->x>>4
0011 0100 0100 0100 0100 0100 0100 0100
0000 0011 0100 0100 0100 0100 0100 0100->x>>4
0011 0111 1000 1000 1000 1000 1000 1000->(x + (x >> 4))
0011 0111 1000 1000 1000 1000 1000 1000->(x + (x >> 4))
0000 1111 0000 1111 0000 1111 0000 1111->0x0F0F0F0F
0000 0111 0000 1000 0000 1000 0000 1000->(x + (x >> 4)) & 0x0F0F0F0F;
0000 0111 0000 1000 0000 1000 0000 1000->(x + (x >> 4)) & 0x0F0F0F0F;
0000 0000 0000 0111 0000 1000 0000 1000->(x >> 8);
0000 0111 0000 1000 0000 1000 0000 1000
0000 0000 0000 0111 0000 1000 0000 1000->(x >> 8);
0000 0111 0000 1111 0001 0000 0001 0000-> x + (x >> 8);
0000 0111 0000 1111 0001 0000 0001 0000
0000 0000 0000 0000 0000 0111 0000 1111->(x >> 16);
0000 0000 0000 0000 0000 0111 0000 1111->(x >> 16);
0000 0111 0000 1111 0001 0000 0001 0000
0000 0111 0000 1111 0001 0111 0001 1111->x + (x >> 16);
0000 0111 0000 1111 0001 0111 0001 1111
0000 0000 0000 0000 0000 0000 0011 1111->0x0000003F
0000 0000 0000 0000 0000 0000 0001 1111-> x & 0x0000003F最后的结果,十进制为31,正确
[解决办法]
int count = 0;while(x){ ++count; x = x & (x - 1);}
[解决办法]
int Count(unsigned x) { x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; x = x + (x >> 8); x = x + (x >> 16); return x & 0x0000003F; }