0

このハクメム アルゴリズムが表示されます。

int pop(unsigned x) {
  unsigned n;

  n = (x >> 1) & 0x77777777;
  x = x - n;
  n = (n >> 1) & 0x77777777;
  x = x - n;
  n = (n >> 1) & 0x77777777;
  x = x - n;
  x = (x + (x >> 4)) & 0x0F0F0F0F;
  x = x * 0x01010101;
  return x >> 24;
}

64 ビットの long に変更することは可能ですか?

4

1 に答える 1

2

「ハミング重み」と呼ばれるものを計算しています。これは、整数の場合、数値の2進数の「1」ビットの数を意味します。2進数の場合、これは「人口カウント」とも呼ばれます。

これを64ビットに実装する方法はいくつかあります。

詳細については、Wikiページを参照してください

ここから盗まれた実装は次のとおりです。

public int Pop(ulong w) 
{
    w -= (w >> 1) & 0x5555555555555555UL;
    w = (w & 0x3333333333333333UL) + ((w >> 2) & 0x3333333333333333UL);
    w = (w + (w >> 4)) & 0x0f0f0f0f0f0f0f0fUL;
    return (int)((w * 0x0101010101010101UL) >> 56);
}
于 2013-03-05T10:37:13.987 に答える