Установить заданный двоичный флаг

У меня есть двоичное число, и я хочу применить логическое значение (true/false) к одному из его флагов.

Предположим, что двоичное значение называется myBinary. Я хочу применить логическое значение X к 4-му флагу (0x08) myBinary.

Я знаю, что могу сделать это так:

function applyBoolean(int myBinary, int mask, boolean X)
{
  if (x = true)
     myBinary = myBinary | mask

  else 
     myBinary  = myBinary & mask 

  return myBinary
}

ОТРЕДАКТИРОВАНО:

Итак, чтобы изменить 4-й флаг, я могу сделать так:

applyBoolean(100101, 001000, правда) -----> возвращает: 101101

applyBoolean(100101, 001000, false) -----> возвращает: 100101

Теперь мне интересно, можно ли это сделать без if/else, используя только побитовые операции.

Спасибо


person Omaty    schedule 26.06.2015    source источник
comment
Вы говорите 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
comment
Похоже, применяя, вы спрашиваете, как установить данный бит в заданное значение, рассматривая ваше число как набор битов. Это правильно? Я думаю, что предоставленный вами код близок, но неверен для этого. Кроме того, какой язык вы используете? Вы должны отредактировать свой вопрос, чтобы добавить более релевантные теги и более четкое объяснение того, что вы хотите.   -  person Dan Getz    schedule 26.06.2015
comment
Правильно Дэн, извините, если мой вопрос был не ясен. Я только что отредактировал пример, используя метод applyBoolean   -  person Omaty    schedule 26.06.2015


Ответы (1)


(Я предполагаю 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