我已经阅读了有关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添加了更安全的版本

10-07 18:22