我正在创建一个国际象棋程序,并且我正在使用位板作为棋盘表示。白色棋子的位板如下所示:
whitePawns=0x000000000000FF00;
现在,如果我想移动方格 D4 上的白兵,我必须将第 12 位移动 8 或 10 位,以便它可以进入下一个等级。我想在不干扰其余位的位置的情况下移动第 12 位。我怎么做?
移动 whitePawns 变量后应如下所示:
whitePawns=0x0000000008F700;
我正在创建一个国际象棋程序,并且我正在使用位板作为棋盘表示。白色棋子的位板如下所示:
whitePawns=0x000000000000FF00;
现在,如果我想移动方格 D4 上的白兵,我必须将第 12 位移动 8 或 10 位,以便它可以进入下一个等级。我想在不干扰其余位的位置的情况下移动第 12 位。我怎么做?
移动 whitePawns 变量后应如下所示:
whitePawns=0x0000000008F700;
1
您可以从旧位置移开并将其放在新位置,而不是移动位。
例如,如果您知道第 5 位的位已设置,而第 12 位的位未设置,并且您想将第 5 位移至第 12 位,则可以使用单个 XOR 来完成:
whitePawns ^= ((1 << 5) | (1 << 12));
其工作方式是使用掩码对值进行异或运算会“翻转”掩码中由 1 标记的值的所有位。在这种情况下,掩码被构造为在位置 5 和 12 中具有 1。当您将其与位置进行异或时,第五位置的 1 变为零,而第 12 位置的零变为 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.
}