2010-11-16 2 views
7

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

я в настоящее время получили это в основном:

unsigned char flags = 0; //8 bits 

flags |= 0x2; //apply random flag 

if(flags & 0x2) { 
    printf("Opt 2 set"); 
} 

Теперь я желающих сделать немного более сложные вещи, что я хочу сделать, это применить три флага, как это:

flags = (0x1 | 0x2 | 0x4); 

А затем удалить флаги 0x1 и 0x2? Я думал, что я мог бы сделать что-то вроде этого, применяя побитовое НЕ (и побитовое И применять его):

flags &= ~(0x1 | 0x2); 

Видимо, они остаются там или что-то в любом случае, когда я проверяю.

Я также не знаю, как проверить, существуют ли они НЕ в битовых флажках (поэтому я не могу проверить, работает ли мой предыдущий код), было бы что-то вроде этого?

if(flags & ~0x2) 
    printf("flag 2 not set"); 

Я не могу найти какие-либо ресурсы из моих недавних поисков, которые относятся к этому, я хочу, чтобы научиться этому, чтобы учить других, я действительно заинтересован. Прошу прощения, если это запутанно или просто.

ответ

21

И удалить два из них? Я думал, что я мог бы сделать что-то вроде этого:

flags &= ~(0x1 | 0x2); 

удалить эти два флага, но , по-видимому, они остаются там или что-то так или иначе.

Это правильный способ удаления флагов. Если вы после этого printf("%d\n", flags), выход должен быть 4.

Я также не знаю, как проверить, если они не существуют в битовым флагом (так я не могу проверить, если мой предыдущий код работы), это было бы что-то вроде этого ?

if(flags & ~0x2) 
    printf("flag 2 not set"); 

Нету:

if ((flags & 0x2) == 0) 
    printf("flag 2 not set"); 

РЕДАКТИРОВАТЬ:

Чтобы проверить на наличие нескольких флагов:

if ((flags & (0x1 | 0x2)) == (0x1 | 0x2)) 
    printf("flags 1 and 2 are set\n"); 

для проверки на отсутствие множества флагов , просто сравните с 0 по-прежнему:

if ((flags & (0x1 | 0x2)) == 0) 
    printf("flags 1 and 2 are not set (but maybe only one of them is!)\n"); 
+0

Я был прав в первый раз, спасибо! – John

+0

Несомненно, без проблем. Поразрядные операторы - забавные. :) – cdhowie

+0

Теперь, как бы проверить, установлены ли два флага без булевых и? например 'if (flags & (0x1 | 0x2))', но это работает, даже если я только установил '0x1' .. – John

11

Я не уверен, почему вы считаете, что операция очистки не будет работать.

flags &= ~(0x1 | 0x2); 

- правильный способ сделать это.Операция, чтобы проверить, если немного не набор:

if (!(flags & 0x2)) ... 

один у вас есть:

if (flags & ~0x2) ... 

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

Если вы хотите, чтобы убедиться, что все бит в группе устанавливается:

if ((flags & (0x2|0x1)) == 0x2|0x1) ... 
Смежные вопросы