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

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

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

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

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

18
задан djeidot 6 August 2010 в 12:39
поделиться

6 ответов

Конечно! Это было бы более очевидно, если бы вы расширили |= и &= в вашем коде, но вы можете написать:

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

Обратите внимание, что bit4Set должен быть нулем или единицей - не любое ненулевое значение - чтобы это работало.

13
ответ дан 30 November 2019 в 07:17
поделиться
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
0
ответ дан 30 November 2019 в 07:17
поделиться

Поместите его в функцию, тип bool будет обеспечивать 0,1 для всех входных битовых значений.

int change_bit(int val, int num, bool bitval)
{
    return (val & ~(1<<num)) | (bitval << num);
}
12
ответ дан 30 November 2019 в 07:17
поделиться

Рассматривали ли вы возможность присвоения мнемоники и/или идентификаторов вашим битам, вместо того, чтобы называть их по номеру?

В качестве примера, скажем, установка бита 4 инициирует SCRAM ядерного реактора. Вместо того чтобы называть его "бит 4", мы назовем его INITIATE_SCRAM. Вот как может выглядеть код для этого:

int const INITIATE_SCRAM = 0x10; // 1 << 4

...

if (initiateScram) {
    nbyte |= INITIATE_SCRAM;
} else {
    nbyte &= ~INITIATE_SCRAM;
}

Это не обязательно будет более эффективным (после оптимизации), чем ваш оригинальный код, но это немного яснее, я думаю, и, вероятно, более удобным для обслуживания.

5
ответ дан 30 November 2019 в 07:17
поделиться

Это совершенно разумная и абсолютно стандартная идиома.

6
ответ дан 30 November 2019 в 07:17
поделиться

Он помечен как C ++, поэтому не рассматривали ли вы возможность использования std :: bitset вместо того, чтобы выполнять все манипуляции с битами самостоятельно? Затем вы можете просто использовать обозначение массива как: бит [3] = bit4Set , чтобы установить соответствующий бит.

2
ответ дан 30 November 2019 в 07:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: