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

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

whitePawns=0x000000000000FF00;

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

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

whitePawns=0x0000000008F700;


person Rohit Shinde    schedule 12.10.2014    source источник
comment
Каков твой вопрос?   -  person R Sahu    schedule 12.10.2014
comment
comment
Я хочу сдвинуть один бит внутри целого числа, не нарушая другие биты.   -  person Rohit Shinde    schedule 12.10.2014


Ответы (2)


Я думаю, ты не хочешь смены, ты хочешь поменяться на биты. Попробуйте отключить бит 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.
}
person rendon    schedule 12.10.2014
comment
Это решение частично подходит к тому, что я имею в виду. Что, если бит, на который я хочу переместить пешку, установлен? В этом случае я не могу поменяться местами. Я просто хочу немного сдвинуть бит с позиции A на позицию B. Он должен перезаписать значение бита B. Каким бы ни было его значение. - person Rohit Shinde; 12.10.2014

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

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

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

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

person Sergey Kalinichenko    schedule 12.10.2014
comment
Будет ли это работать, если бит в позиции 12 установлен? Какая модификация будет в этом случае? - person Rohit Shinde; 12.10.2014
comment
@RohitShinde Если установлен бит в позиции 12, это не сработает, потому что XOR переворачивает биты, отмеченные 1 с. Если вы хотите сбросить бит до нуля, используйте v &= ~(1<<i). Чтобы установить бит безусловно, используйте v |= (1<<i). Причина, по которой я думал, что XOR будет хорошо работать, заключается в том, что фигура не может заменить фигуру того же цвета в шахматах. - person Sergey Kalinichenko; 12.10.2014