我有一个使用位标志的枚举声明,但我无法确切地弄清楚如何使用它。
enum
{
kWhite = 0,
kBlue = 1 << 0,
kRed = 1 << 1,
kYellow = 1 << 2,
kBrown = 1 << 3,
};
typedef char ColorType;
我应该把位运算符 OR
用在一起,才能将多个颜色存储在一个colorType
中吗?
ColorType pinkColor = kWhite | kRed;
但是假设我想要检查 pinkColor
是否包含 kRed
,我该如何做?
有人能否给我一个使用提供的 ColorType
示例的例子?
pinkColor
是kRed
,那么(pinkColor & kRed)
将评估为kRed
,而不是1或YES
!这可能是在赋值给小类型(如BOOL
)时的一个陷阱:如果该值大于1 <<(BOOL
中位数),则它将超出范围。常见的解决方法是将结果与被测试的位进行比较:BOOL isPink = ((pinkColor & kRed) == kRed);
另一种方法是将结果转换为C99的bool
类型:isPink = (bool)(pinkColor & kRed);
还有一种(诚然不常见)做法,它并不假设1在范围内,可以使用?:
:isPink = (pinkColor & kRed) ? YES : NO;
- Peter Hosey