我怎样才能有效地摆脱攻击面具,看起来像这样:
....1...
1...1...
.1..1..1
..1.1.1.
...111..
11111111
..1.11..
.1..1.1.
为女王。
bitScanForward
我过去所做的是,通过计算尾随零(下一个攻击方。是否有任何技术可以直接获得单个攻击位?
我认为您所描述的已经是最有效的方法。在位板上循环直到它为零并一次选择一个动作。
用一些代码来勾勒这个想法,它可能看起来像这样:
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 或 Clang,则可以使用__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
已经是找到最低有效位的实现。因此,您可以使用它来获得便携式版本。