(Я предполагаю mask == 0x8
, если X == true
, и mask == ~0x8
, если X == false
, иначе ваш оператор не будет соответствовать вашему коду.)
Чтобы использовать «только побитовые операции», вам нужно будет преобразовать это логическое значение в число.
Поскольку вы не указали язык программирования, я предполагаю, что вы ищете общий/концептуальный ответ.
Однако , возможно это или нет, зависит от особенностей вашего языка программирования, а именно от возможности трактовать логические значения как числа.
Например, в JavaScript это можно сделать так
function applyBoolean(myBinary, X)
{
return (myBinary & ~0x8) ^ (X << 3);
}
Логика этого относительно проста:
- Установите бит
0x8
в 0
(побитовое И с побитовой инверсией 0x8
).
- Сдвинуть
X
на 3 бита влево, неявно преобразовав его в число.
- XOR
myBinary
с этим значением, в результате чего бит 0x8
становится 0
для X == false
и 1
для X == true
.
В PHP это практически то же самое:
function applyBoolean($myBinary, $X)
{
return ($myBinary & ~0x8) ^ ($X << 3);
}
В Java это вообще нельзя сделать, используя только побитовые операторы, так как boolean
нельзя преобразовать в число. Вам придется использовать if
, тернарный оператор или функцию.
В некоторых языках, таких как ассемблер и C до C99, это может считаться неприменимым, поскольку в этих языках отсутствует (настоящий) логический тип.
Однако, если 0
и 1
считаются логическими, решение столь же тривиально, как переписывание фрагмент выше на этих языках.
И последнее (и, вероятно, не менее важное), в некоторых языках, таких как Brainfuck, просто отсутствуют логические операторы, что делает эту задачу невыполнимой.
person
Siguza
schedule
26.06.2015
apply the boolean value X to ... myBinary
, но не продемонстрировали этого в образцеI know I can do it this way
. Вы действительно хотите рассматриватьx
как двоичное значение1000
(8)? Я думаю, мы могли бы использовать немного больше объяснений того, чего вы пытаетесь достичь. Предоставьте образцы входных данных для вашей функцииapplyBoolean
и ожидаемые результаты. - person Cᴏʀʏ   schedule 26.06.2015