【问题标题】:Shifting only 1 bit in an integer by a specific number of places仅将整数中的 1 位移动特定位数
【发布时间】:2014-12-06 22:13:06
【问题描述】:

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

whitePawns=0x000000000000FF00;

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

改变 whitePawns 变量后应该是这样的:

whitePawns=0x0000000008F700;

【问题讨论】:

标签: c++ bit-manipulation bitboard


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果设置了位置 12 的位,这会起作用吗?在这种情况下会有什么修改?
  • @RohitShinde 如果位置 12 的位被设置,这将不起作用,因为XOR 翻转标记为 1 的位。如果要将位重置为零,请使用v &amp;= ~(1&lt;&lt;i)。要无条件设置位,请使用v |= (1&lt;&lt;i)。我认为 XOR 可以很好地工作的原因是棋子不能替换国际象棋中相同颜色的棋子。
【解决方案2】:

我认为你不想换班,你想换位。尝试关闭位 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.
}

【讨论】:

  • 这个解决方案部分接近了我的想法。如果我想将我的棋子移动到的位被设置了怎么办?在那种情况下,我不能交换。我只是想将位置 A 移到位置 B。它必须覆盖位 B 的值。不管它的值是什么。
猜你喜欢
  • 2013-09-18
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多