这个问题在这里已有答案:
我想计算long long类型变量中的位数。例如,1100011001 - > 5
在整数类型中,我可以使用
a = (a & 0x5555) + ((a & 0xAAAA) >> 1);
a = (a & 0x3333) + ((a & 0xCCCC) >> 2);
a = (a & 0x0F0F) + ((a & 0xF0F0) >> 4);
a = (a & 0x00FF) + ((a & 0xFF00) >> 8);
但在“长期”的情况下,该怎么做?
您的代码适用于16位整数。
要使其与32位整数一起使用,您需要:
这是结果:
a = (a & 0x55555555) + ((a & 0xAAAAAAAA) >> 1);
a = (a & 0x33333333) + ((a & 0xCCCCCCCC) >> 2);
a = (a & 0x0F0F0F0F) + ((a & 0xF0F0F0F0) >> 4);
a = (a & 0x00FF00FF) + ((a & 0xFF00FF00) >> 8);
a = (a & 0x0000FFFF) + ((a & 0xFFFF0000) >> 16);
然后,为了使其适用于64位整数,您重复相同的过程:
a = (a & 0x5555555555555555) + ((a & 0xAAAAAAAAAAAAAAAA) >> 1);
...
a = (a & 0x0000FFFF0000FFFF) + ((a & 0xFFFF0000FFFF0000) >> 16);
a = (a & 0x00000000FFFFFFFF) + ((a & 0xFFFFFFFF00000000) >> 32);