Каков наилучший способ установить определенный бит в переменной в C - PullRequest
5 голосов
/ 02 сентября 2011

Рассмотрим переменную unsigned int a; в C.

Теперь скажите, что я хочу установить любой i-й бит в этой переменной на «1».

Обратите внимание, что переменная имеет некоторое значение.Так что a=(1<<i) не будет работать.

a=a+(1<<i) будет работать, но я ищу самый быстрый способ.Что-нибудь ??

Ответы [ 7 ]

11 голосов
/ 02 сентября 2011

Побит или это. например a |= (1<<i)

8 голосов
/ 02 сентября 2011

Некоторые полезные макросы для работы с битами

#define BIT_MASK(bit)             (1 << (bit))
#define SET_BIT(value,bit)        ((value) |= BIT_MASK(bit))
#define CLEAR_BIT(value,bit)      ((value) &= ~BIT_MASK(bit))
#define TEST_BIT(value,bit)       (((value) & BIT_MASK(bit)) ? 1 : 0)
3 голосов
/ 02 сентября 2011

Наиболее распространенный способ сделать это:

a |= (1 << i);

Это всего две операции - сдвиг и ИЛИ.Трудно понять, как это можно улучшить.

2 голосов
/ 02 сентября 2011

Вы должны использовать побитовое ИЛИ для этой операции.

a |= 1 << i;
1 голос
/ 02 сентября 2011

Способ, которым я реализовал битовые флаги (чтобы процитировать прямо из моей кодовой базы, вы можете свободно использовать его для любых целей, даже коммерческих):

void SetEnableFlags(int &BitFlags, const int Flags)
{
    BitFlags = (BitFlags|Flags);
}
const int EnableFlags(const int BitFlags, const int Flags)
{
    return (BitFlags|Flags);
}

void SetDisableFlags(int BitFlags, const int Flags)
{
    BitFlags = (BitFlags&(~Flags));
}
const int DisableFlags(const int BitFlags, const int Flags)
{
    return (BitFlags&(~Flags));
}

Операция побитового сдвига не требуется.

Возможно, вам придется привести в порядок или изменить код, чтобы использовать конкретный набор переменных, который вы используете, но в целом он должен работать нормально.

1 голос
/ 02 сентября 2011

Вы можете использовать побитовое ИЛИ:

a |= (1 << i);

Обратите внимание, что это не ведет себя так же, как +, который будет переноситься, если в бите, который вы устанавливаете, уже есть 1.

1 голос
/ 02 сентября 2011

Возможно, вы могли бы использовать

a |= (1 << i)

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

Возможно, вы сможете попытаться создать таблицу, в которой вы отобразите i на битовую маску (например, 2 => 0x0010 для 0000000000100), но это немного излишне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...