Как использовать перечисления с битовыми флагами - PullRequest
25 голосов
/ 19 августа 2010

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

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 пример?

1 Ответ

33 голосов
/ 19 августа 2010

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

ColorType pinkColor = kWhite | kRed;

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

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

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

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

BOOL hasRed = ((pinkColor & kRed) == kRed);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...