Прямо сейчас я использую это для устанавливания/сбрасывания отдельных битов в байте:
if (bit4Set)
nbyte |= (1 << 4);
else
nbyte &= ~(1 << 4);
Но, разве Вы не можете сделать этого более простым/изящным способом? Как установка или сбрасывание бита в единственной операции?
Примечание: Я понимаю, что могу просто записать функцию, чтобы сделать это, я просто задаюсь вопросом, не буду ли я изобретать велосипед.
Конечно! Это было бы более очевидно, если бы вы расширили |=
и &=
в вашем коде, но вы можете написать:
nbyte = (nbyte & ~(1<<4)) | (bit4Set<<4);
Обратите внимание, что bit4Set
должен быть нулем или единицей - не любое ненулевое значение - чтобы это работало.
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
Поместите его в функцию, тип bool будет обеспечивать 0,1 для всех входных битовых значений.
int change_bit(int val, int num, bool bitval)
{
return (val & ~(1<<num)) | (bitval << num);
}
Рассматривали ли вы возможность присвоения мнемоники и/или идентификаторов вашим битам, вместо того, чтобы называть их по номеру?
В качестве примера, скажем, установка бита 4 инициирует SCRAM ядерного реактора. Вместо того чтобы называть его "бит 4", мы назовем его INITIATE_SCRAM
. Вот как может выглядеть код для этого:
int const INITIATE_SCRAM = 0x10; // 1 << 4
...
if (initiateScram) {
nbyte |= INITIATE_SCRAM;
} else {
nbyte &= ~INITIATE_SCRAM;
}
Это не обязательно будет более эффективным (после оптимизации), чем ваш оригинальный код, но это немного яснее, я думаю, и, вероятно, более удобным для обслуживания.
Это совершенно разумная и абсолютно стандартная идиома.
Он помечен как C ++, поэтому не рассматривали ли вы возможность использования std :: bitset
вместо того, чтобы выполнять все манипуляции с битами самостоятельно? Затем вы можете просто использовать обозначение массива как: бит [3] = bit4Set
, чтобы установить соответствующий бит.