只将整数中的1位移位特定的位数

Shifting only 1 bit in an integer by a specific number of places

本文关键字:1位 整数      更新时间:2023-10-16

我正在创建一个国际象棋程序,对于棋盘表示,我正在使用比特板。白色棋子的比特板看起来是这样的:

whitePawns=0x000000000000FF00;

现在,如果我想移动方块D4上的白色棋子,我必须将第12位移动8或10位,这样它才能进入下一个等级。我想在不干扰剩余位的位置的情况下移位第12位。我该怎么做?

在转换whitePawns变量后,应该如下所示:

whitePawns=0x0000000008F700;

您可以从旧位置移除1,然后将其放在新位置,而不是移位位。

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

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

它的工作方式是将一个值与掩码进行异或,"翻转"掩码中由1标记的值的所有位。在这种情况下,掩模被构造为在位置5和12具有1。当你把它和位置异或时,第五个位置的1变成0,第12个位置的0变成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.
}