Подтвердить что ты не робот

Как использовать перечисления с битовыми флагами

У меня есть объявление перечисления с использованием битовых флагов, и я не могу точно определить, как это использовать.

enum 
{
  kWhite   = 0,
  kBlue    = 1 << 0,
  kRed     = 1 << 1,
  kYellow  = 1 << 2,
  kBrown   = 1 << 3,
};
typedef char ColorType;

Я полагаю, чтобы хранить несколько цветов в одном colorType Я должен OR биты вместе?

ColorType pinkColor = kWhite | kRed;

Но предположим, что я хочу проверить, содержит ли pinkColor kRed, как бы это сделать?

Кто-нибудь хочет дать мне пример, используя предоставленный colorType пример?

4b9b3361

Ответ 1

Да, используйте побитовое ИЛИ (|) для установки нескольких флагов:

ColorType pinkColor = kWhite | kRed;

Затем используйте побитовое И (&), чтобы проверить, установлен ли флаг:

if ( pinkColor & kRed )
{
   // do something
}

Результат & имеет любой бит, установленный только в том случае, если тот же бит установлен в обоих операндах. Так как единственный бит в kRed - бит 1, результат будет равен 0, если другой операнд также не имеет этого бита.

Если вам нужно определить, установлен ли конкретный флаг как BOOL, а не просто проверить его в состоянии if, сравните результат побитового И с проверенным битом:

BOOL hasRed = ((pinkColor & kRed) == kRed);