简体   繁体   中英

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

I am creating a chess program and for the board representation I am using bitboards. The bitboard for white pawns looks like this:

whitePawns=0x000000000000FF00;

Now, if I want to move the white pawn on the square D4, I would have to shift the 12th bit by either 8 or 10 places so that it can get on to the next rank. I want to shift the 12th bit without disturbing the positions of the remaining bits. How do I do that?

After shifting the whitePawns variable should look this:

whitePawns=0x0000000008F700;

Rather than shifting the bit, you can remove 1 from the old position, and put it in the new position.

For example, if you know that the bit at position 5 is set, and the bit at position 12 is not set, and you want to shift the fifth bit to the 12-th position, you can do it with a single XOR:

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

The way this works is that XOR-ing a value with a mask "flips" all bits of the value marked by 1s in the mask. In this case, the mask is constructed to have 1s in positions 5 and 12. When you XOR it with the positions, the 1 in fifth position becomes zero, and zero in the 12-th position becomes 1.

I think you don't want a shift, you want to swap to bits. Try turning bit A off and then turning bit B on. Something like this:

whitePawns &= ~(1 << A); // Turn bit A off
whitePawns |= (1 << B);  // Turn bit B on

Where A and B are the positions of the bits you want to swap.

EDIT: Whether the move is valid or not is another story, make the move only if bit B is NOT set (and probably other conditions):

if (!(whitePawns & (1 << B))) {
    // Make the swap.
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM