Я создаю шахматную программу и для представления на доске использую битборды. Доска для белых пешек выглядит так:
whitePawns=0x000000000000FF00;
Теперь, если я хочу переместить белую пешку на поле D4, мне нужно сдвинуть 12-й бит на 8 или 10 мест, чтобы он мог перейти на следующий ранг. Я хочу сдвинуть 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.
}
Вместо того, чтобы сдвинуть бит, вы можете удалить 1
из старой позиции, и положить его в новую позицию.
Например, если вы знаете, что бит в позиции 5 установлен, а бит в позиции 12 не установлен, и вы хотите сместить пятый бит в 12-ю позицию, вы можете сделать это с помощью одного XOR:
whitePawns ^= ((1 << 5) | (1 << 12));
Это работает так, что XOR-значение с маской «переворачивает» все биты значения, отмеченного в маске 1 с. В этом случае маска построена так, чтобы иметь 1 в позициях 5 и 12. Когда вы XOR ее с позициями, 1 в пятой позиции становится нулем, а ноль в 12-й позиции становится 1.