我已经阅读了有关32位的this SO question,但是关于64位的数字呢?我是否应该仅屏蔽高4位和低4位字节,对32位进行计数,然后将它们加在一起?
最佳答案
您可以在这里找到64位版本http://en.wikipedia.org/wiki/Hamming_weight
是这样的
static long NumberOfSetBits(long i)
{
i = i - ((i >> 1) & 0x5555555555555555);
i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
return (((i + (i >> 4)) & 0xF0F0F0F0F0F0F0F) * 0x101010101010101) >> 56;
}
这是此代码形式的64位版本How to count the number of set bits in a 32-bit integer?
使用约书亚的建议,我可以将其转换为:
static int NumberOfSetBits(ulong i)
{
i = i - ((i >> 1) & 0x5555555555555555UL);
i = (i & 0x3333333333333333UL) + ((i >> 2) & 0x3333333333333333UL);
return (int)(unchecked(((i + (i >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56);
}
编辑:我在测试32位版本时发现了一个错误。我添加了缺少的括号。总和应在按位&之前的最后一行中完成
EDIT2 为ulong添加了更安全的版本