国际象棋程序设计:如何从一个位板攻击中获得一次移动 - 掩盖最有效

时间:2017-12-21 10:27:25

标签: chess bitboard

如何有效地从攻击面具中取出一个动作,如下所示:

bitScanForward

为女王。

我过去所做的是通过计算尾随零(<material-tab-panel centerStrip class="tab-panel visible-desktop" [activeTabIndex]="1"> <material-tab label="Home"> Eager Content of Tab 1 </material-tab> <material-tab label="Tab 1"> <div class="tab-background"> </div> </material-tab> <material-tab label="Tab 2"> Eager Content of Tab 3 </material-tab> <material-tab label="Tab 3"> Eager Content of Tab 3 </material-tab> </material-tab-panel> )来获取每个可能移动的方形指数 在我生成新动作后,我从攻击面具中移除了这个方块并继续使用下一个攻击方块。是否有任何技术可以直接获得单个攻击位?

1 个答案:

答案 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或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已经是一个实现,可以找到最不重要的位。因此,您可以使用它来获得便携版本。