побитовая проверка наличия флага - PullRequest
15 голосов
/ 19 октября 2011

Существует ли метод, обычно используемый для проверки наличия флага в типе данных int / other? Я понял что-то вроде этого:

if ((host&flagtocheckfor)==flagtocheckfor)

Что работает нормально, однако это настолько распространенный метод установки флагов, как обычно проверяются флаги? Или есть более краткий метод?

1 Ответ

30 голосов
/ 19 октября 2011

Это очень хорошо точно способ проверки битовых флагов на большинстве языков, которые их поддерживают.

Например:

#define BIT_7 0x80
#define BITS_0_AND_1 0x03

if ((flag & BIT_7) == BIT_7) ...
if ((flag & BITS_0_AND_1) == BITS_0_AND_1) ...

Хотя вы можете проверить что-то вродепервый с:

if ((flag & BIT_7) != 0) ...

, который на самом деле не будет работать в течение второго, поскольку он вернет true, если установлены либо битов, но не оба.

Для полноты C позволяет установить битовые маски с помощью:

flag = flag | BIT_7;   // or you can also use 'flag |= BIT_7'

Вы можете очистить их с помощью:

flag = flag & (~BIT_7);

И переключить их с помощью:

flag = flag ^ BIT_7;
...