0

我正在创建一个国际象棋程序,并且我正在使用位板作为棋盘表示。白色棋子的位板如下所示:

whitePawns=0x000000000000FF00;

现在,如果我想移动方格 D4 上的白兵,我必须将第 12 位移动 8 或 10 位,以便它可以进入下一个等级。我想在不干扰其余位的位置的情况下移动第 12 位。我怎么做?

移动 whitePawns 变量后应如下所示:

whitePawns=0x0000000008F700;

4

2 回答 2

3

1您可以从旧位置移开并将其放在新位置,而不是移动位。

例如,如果您知道第 5 位的位已设置,而第 12 位的位未设置,并且您想将第 5 位移至第 12 位,则可以使用单个 XOR 来完成:

whitePawns ^= ((1 << 5) | (1 << 12));

其工作方式是使用掩码对值进行异或运算会“翻转”掩码中由 1 标记的值的所有位。在这种情况下,掩码被构造为在位置 5 和 12 中具有 1。当您将其与位置进行异或时,第五位置的 1 变为零,而第 12 位置的零变为 1。

于 2014-10-12T03:19:33.160 回答
1

我认为你不想换班,你想换位。尝试关闭位 A,然后打开位 B。像这样的东西:

whitePawns &= ~(1 << A); // Turn bit A off
whitePawns |= (1 << B);  // Turn bit B on

其中 A 和 B 是您要交换的位的位置。

编辑:移动是否有效是另一回事,只有在位 B 未设置(可能还有其他条件)时才移动:

if (!(whitePawns & (1 << B))) {
    // Make the swap.
}
于 2014-10-12T03:19:40.887 回答