只将整数中的1位移位特定的位数
Shifting only 1 bit in an integer by a specific number of places
我正在创建一个国际象棋程序,对于棋盘表示,我正在使用比特板。白色棋子的比特板看起来是这样的:
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.
}
相关文章:
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 从两个 4x64 位整数数组中获取取模
- 在 c++ 中输出 64 位整数
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 在 64 位整数内旋转(90°)位矩阵(最多 8x8 位)
- 如何通过COM接口将64位整数从C++发送到C#
- GMP-将64位整数存储在mpz_t/mpz_class中,并返回64位整数
- 将74位整数转换为以31为底的整数
- 如何创建128位整数文本
- 如何忽略32位整数中的特定位
- int64_t 不包含 13 位整数
- MongoDB C++ 驱动程序 - 8 位和 16 位整数?
- 检测 32 位整数溢出
- 将 64 位整数中的每个其他位与 32 位整数进行比较
- 按段比较 64 位整数
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- 将 2 位整数分配给 char 变量
- SSE 整数 2^n 的 2 次方,对于没有 AVX2 的 32 位整数
- 32 位整数缩放,无溢出
- 在C 中旋转每3位整数