我有一个使用位标志的枚举声明,我不能确切地弄清楚如何使用它。

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示例给我一个示例吗?

最佳答案

是的,使用按位或(|)设置多个标志:

ColorType pinkColor = kWhite | kRed;

然后使用按位AND(&)测试是否设置了标志:
if ( pinkColor & kRed )
{
   // do something
}

只有在两个操作数中都设置了相同的位时,&的结果才设置为任何位。由于kRed中的唯一位是位1,如果另一个操作数也未设置该位,则结果将为0。

如果您需要获取是否将特定标志设置为BOOL,而不仅仅是立即在if条件下对其进行测试,请将按位与的结果与被测试的位进行比较:
BOOL hasRed = ((pinkColor & kRed) == kRed);

07-28 03:02