あなたが説明していることは、すでに最も効率的な方法だと思います。ビットボードが0になるまでループし、一度に1つの移動を選択します。いくつかのコードでアイデアをスケッチする
、それは次のようになります。
using Bitboard = uint64_t; // 64 bit unsigned integer
pMoves createAllMoves(Bitboard mask, int from_sq, Move* pMoves) {
while(moves != 0) {
int to_sq = findAndClearSetBit(mask);
*pMoves++ = createMove(from_sq, to_sq);
}
return pMoves;
}
findAndClearSetBit
機能を任意のセットビットを選択しますが、一般的に、今日のハードウェア上で、最下位ビットを見つけることが最も効率的であることができます。あなたはGCCやクランを使用している場合は、特定のハードウェアに最適化しなければならない__builtin_ctzll
を使用することができます。
int findAndClearSetBit(Bitboard& mask) {
int sq = __builtin_ctzll(mask); // find least significant bit
mask &= mask - 1; // clear least significant bit
return sq;
}
を、私は間違っていないよ場合は、既存の機能bitScanForward
はすでに最下位ビットを見つけるための実装です。だから、あなたはそれを移植可能なバージョンを得るために使うことができます。