我正在创建一个国际象棋程序和用于董事会代表的位置,我正在使用位板。白棋子的棋盘看起来是这样的:在特定数量的位置上仅移位整数中的1位
whitePawns=0x000000000000FF00;
现在,如果我想搬到广场上D4白色的棋子,我会通过8个或者10位到第12位移,使得可以进入下一个等级。我想在不干扰其余位的位置的情况下移动第12位。我怎么做?
移位whitePawns变量应该看在此之后:
whitePawns=0x0000000008F700;
我正在创建一个国际象棋程序和用于董事会代表的位置,我正在使用位板。白棋子的棋盘看起来是这样的:在特定数量的位置上仅移位整数中的1位
whitePawns=0x000000000000FF00;
现在,如果我想搬到广场上D4白色的棋子,我会通过8个或者10位到第12位移,使得可以进入下一个等级。我想在不干扰其余位的位置的情况下移动第12位。我怎么做?
移位whitePawns变量应该看在此之后:
whitePawns=0x0000000008F700;
我认为你不想换班,你想换个位。尝试关闭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.
}
这个解决方案部分接近我的想法。如果我想移动我的棋子,那么该怎么办?在这种情况下,我不能交换。我只是想稍微改变位置到位置B.它必须覆盖位B的值。无论它是什么值。 – 2014-10-12 03:34:51
而不是偏移一点,你可以从旧位置删除1
,并把它在新的位置。
例如,如果您知道位置5的位已设置,并且未设置位置12的位,并且您想将第五位移到第12位,则可以使用单XOR:
whitePawns ^= ((1 << 5) | (1 << 12));
这种工作方式是,异或值带着面具“翻转”用掩码1S标注值的所有位。在这种情况下,蒙版被构造为在位置5和12中具有1。当与位置异或时,第五位中的第一位变为零,并且第十二位中的零变为1.
如果位置12的位被设置,这会工作吗?这种情况下的修改是什么? – 2014-10-12 03:35:09
@RohitShinde如果位置12的位被设置,这将不起作用,因为'XOR'翻转标记为1的位。如果你想重置一个位为零,使用'v&=〜(1 << i)'。要无条件设置,使用'v | =(1 << i)'。我认为XOR可以很好地工作的原因是棋子不能代替国际象棋中的相同颜色。 – dasblinkenlight 2014-10-12 03:40:26
什么是你的问题? – 2014-10-12 03:16:48
[使用位域或按位运算符在一个字节内移动一点点]的可能重复(http://stackoverflow.com/questions/6431107/moving-a-bit-within-a-byte-using-bitfield-or-bitwise-运算符) – user657267 2014-10-12 03:18:00
我想在整数内移位一个位而不会干扰其他位。 – 2014-10-12 03:21:18