Подтвердить что ты не робот

Простой способ установить/отключить отдельный бит

Сейчас я использую это для установки/отмены отдельных бит в байте:

if (bit4Set)
   nbyte |= (1 << 4);
else
   nbyte &= ~(1 << 4);

Но вы не можете сделать это более простым/изящным способом? Как установка или снятие бит в течение одной операции?

Примечание. Я понимаю, что могу просто написать функцию для этого, мне просто интересно, не изобретаю ли я колесо.

4b9b3361

Ответ 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