Search code examples
c++bit-manipulationbitboard

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;


Solution

  • 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.
    }