仅按特定数量的位数在整数中移位1位

时间:2014-10-12 03:13:43

标签: c++ bit-manipulation bitboard

我正在创建一个国际象棋程序,对于董事会代表我正在使用位板。白色棋子的位板看起来像这样:

whitePawns=0x000000000000FF00;

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

转移whitePawns变量之后应该看看:

whitePawns=0x0000000008F700;

2 个答案:

答案 0 :(得分:3)

您可以从旧位置移除1,而不是移动该位,并将其置于新位置。

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

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

这种方法的工作方式是用掩码对一个值进行异或运算&#34;翻转&#34;掩码中标记为1的值的所有位。在这种情况下,掩码被构造成在位置5和12处具有1。当你对位置进行异或时,第五位置的1变为零,第12位的零变为1.

答案 1 :(得分: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.
}