Простой способ установить/отключить отдельный бит
Сейчас я использую это для установки/отмены отдельных бит в байте:
if (bit4Set)
nbyte |= (1 << 4);
else
nbyte &= ~(1 << 4);
Но вы не можете сделать это более простым/изящным способом? Как установка или снятие бит в течение одной операции?
Примечание. Я понимаю, что могу просто написать функцию для этого, мне просто интересно, не изобретаю ли я колесо.
Ответы
Ответ 1
Конечно! Было бы более очевидно, если бы вы расширили |=
и &=
в своем коде, но вы можете написать:
nbyte = (nbyte & ~(1<<4)) | (bit4Set<<4);
Обратите внимание, что bit4Set
должно быть нулевым или одним - не любым ненулевым значением - для этого нужно работать.
Ответ 2
Поместите его в функцию, тип bool будет применять 0,1 для всех битвальных входов.
int change_bit(int val, int num, bool bitval)
{
return (val & ~(1<<num)) | (bitval << num);
}
Ответ 3
Это совершенно разумная и полностью стандартная идиома.
Ответ 4
Рассматривали ли вы назначение мнемоники и/или идентификаторов для своих битов, вместо того, чтобы ссылаться на них по числу?
В качестве примера предположим, что установочный бит 4 инициирует ядерный реактор SCRAM. Вместо того, чтобы ссылаться на него как "бит 4", мы будем называть его INITIATE_SCRAM
. Вот как выглядит код для этого:
int const INITIATE_SCRAM = 0x10; // 1 << 4
...
if (initiateScram) {
nbyte |= INITIATE_SCRAM;
} else {
nbyte &= ~INITIATE_SCRAM;
}
Это не обязательно будет более эффективным (после оптимизации), чем ваш исходный код, но это немного яснее, я думаю, и, вероятно, более ремонтопригодным.
Ответ 5
Это помечено как С++, поэтому вы считаете, что используете std::bitset
вместо того, чтобы выполнять все манипуляции с битами самостоятельно? Затем вы можете просто использовать обозначение массива как: bits[3] = bit4Set
, чтобы установить соответствующий бит.
Ответ 6
nbyte |= (1 << 4);
Если правая часть задания (1 << 4)
всегда всегда такая, как это, то это, вероятно, будет оптимизировано компилятором, поэтому в результате сборки будет проще:
mov r0, _nbyte
mov r1, 10H ; here is the optimization, no bit shift occured
or r0, r1
st _nbyte, r0