ここですでに回答されている同様の質問に関係なく、次のことを知りたいです。
- 与えられた2 のハミング距離と同じ hammingweightでランダムな64 ビットネイバーを計算する最速の方法は何ですか?
私は次のやや素朴な実装を思いつきました。Core i7 マシンで MSVC を使用している場合、どうすれば (はるかに) うまくいくでしょうか?
- 例:
で呼び出される randomNeighbor
00000000000000000000000000000000010111101011110011000111010111
たとえば、
00000000000000000000000000000000010111101011110011001110010111
つまり、ハミング距離は 2 です。
int msb = 36; // msb
int hw = 19; // hammingweight
long long randomNeighbor(long long number) {
long long neighbor = number;
int setBitCnt = 0;
int unsetBitCnt = 0;
int setBitNr = rnd(hw - 1);
int unsetBitNr = rnd(msb - hw - 1);
bool setBit = true;
bool unsetBit = true;
for (int x = 0; setBit && unsetBit && x < msb; x++)
{
if (_bittest64(&neighbor, x))
{
if (setBitCnt == setBitNr)
{
_bittestandreset64(&neighbor, x);
}
setBitCnt++;
}
else
{
if (unsetBitCnt == unsetBitNr)
{
_bittestandset64(&neighbor, x);
}
unsetBitCnt++;
}
}
return neighbor;
}