Сдвиг только 1 бита в целое число на определенное количество мест

Я создаю шахматную программу и для представления на доске использую битборды. Доска для белых пешек выглядит так:

whitePawns=0x000000000000FF00;

Теперь, если я хочу переместить белую пешку на поле D4, мне нужно сдвинуть 12-й бит на 8 или 10 мест, чтобы он мог перейти на следующий ранг. Я хочу сдвинуть 12-й бит, не нарушая положения оставшихся бит. Как я могу это сделать?

После сдвига переменная whitePawns должна выглядеть так:

whitePawns=0x0000000008F700;

0

Решение

Я думаю, что вы не хотите сдвиг, вы хотите поменяться местами. Попробуйте выключить бит 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

Другие решения

Вместо того, чтобы сдвинуть бит, вы можете удалить 1 из старой позиции, и положить его в новую позицию.

Например, если вы знаете, что бит в позиции 5 установлен, а бит в позиции 12 не установлен, и вы хотите сместить пятый бит в 12-ю позицию, вы можете сделать это с помощью одного XOR:

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

Это работает так, что XOR-значение с маской «переворачивает» все биты значения, отмеченного в маске 1 с. В этом случае маска построена так, чтобы иметь 1 в позициях 5 и 12. Когда вы XOR ее с позициями, 1 в пятой позиции становится нулем, а ноль в 12-й позиции становится 1.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector