2014-10-12 69 views
0

我正在创建一个国际象棋程序和用于董事会代表的位置,我正在使用位板。白棋子的棋盘看起来是这样的:在特定数量的位置上仅移位整数中的1位

whitePawns=0x000000000000FF00;

现在,如果我想搬到广场上D4白色的棋子,我会通过8个或者10位到第12位移,使得可以进入下一个等级。我想在不干扰其余位的位置的情况下移动第12位。我怎么做?

移位whitePawns变量应该看在此之后:

whitePawns=0x0000000008F700;

+0

什么是你的问题? – 2014-10-12 03:16:48

+0

[使用位域或按位运算符在一个字节内移动一点点]的可能重复(http://stackoverflow.com/questions/6431107/moving-a-bit-within-a-byte-using-bitfield-or-bitwise-运算符) – user657267 2014-10-12 03:18:00

+0

我想在整数内移位一个位而不会干扰其他位。 – 2014-10-12 03:21:18

回答

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. 
} 
+0

这个解决方案部分接近我的想法。如果我想移动我的棋子,那么该怎么办?在这种情况下,我不能交换。我只是想稍微改变位置到位置B.它必须覆盖位B的值。无论它是什么值。 – 2014-10-12 03:34:51

3

而不是偏移一点,你可以从旧位置删除1,并把它在新的位置。

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

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

这种工作方式是,异或值带着面具“翻转”用掩码1S标注值的所有位。在这种情况下,蒙版被构造为在位置5和12中具有1。当与位置异或时,第五位中的第一位变为零,并且第十二位中的零变为1.

+0

如果位置12的位被设置,这会工作吗?这种情况下的修改是什么? – 2014-10-12 03:35:09

+1

@RohitShinde如果位置12的位被设置,这将不起作用,因为'XOR'翻转标记为1的位。如果你想重置一个位为零,使用'v&=〜(1 << i)'。要无条件设置,使用'v | =(1 << i)'。我认为XOR可以很好地工作的原因是棋子不能代替国际象棋中的相同颜色。 – dasblinkenlight 2014-10-12 03:40:26