如何使用带有位标志的枚举

Oys*_*sio 25 cocoa enums objective-c

我有一个使用位标志的枚举声明,我无法弄清楚如何使用它.

enum 
{
  kWhite   = 0,
  kBlue    = 1 << 0,
  kRed     = 1 << 1,
  kYellow  = 1 << 2,
  kBrown   = 1 << 3,
};
typedef char ColorType;
Run Code Online (Sandbox Code Playgroud)

我想将多种颜色存储在一起colorType我应该OR将这些位一起存储?

ColorType pinkColor = kWhite | kRed;
Run Code Online (Sandbox Code Playgroud)

但是假设我想检查是否pinkColor包含kRed,我该怎么做?

有人想用我提供的ColorType例子给我一个例子吗?

wal*_*lky 33

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

ColorType pinkColor = kWhite | kRed;
Run Code Online (Sandbox Code Playgroud)

然后使用按位AND(&)来测试是否设置了一个标志:

if ( pinkColor & kRed )
{
   // do something
}
Run Code Online (Sandbox Code Playgroud)

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

如果您需要获取特定标志是否设置为a BOOL而不是仅在if条件中立即测试它,请将按位AND的结果与测试位进行比较:

BOOL hasRed = ((pinkColor & kRed) == kRed);
Run Code Online (Sandbox Code Playgroud)

  • 注意:这意味着如果`pinkColor`是`kRed`,`(pinkColor&kRed)`将评估为`kRed`,*not*1或`YES`!当分配给诸如`BOOL`的小类型时,这可能是一个陷阱:如果值为1 <<("BOOL"中的位数)或更大,则它将超出范围.一个常见的解决方法是将结果与测试位进行比较:`BOOL isPink =((pinkColor&kRed)== kRed);`另一种方法是将结果转换为C99的`bool`类型:`isPink =(bool)( pinkColor&kRed);`并且假定1在范围内的一种(通常不常见的)方式将使用`?:`:`isPink =(pinkColor&kRed)?是:否;` (19认同)