我有四面旗帜
Current = 0x1 Past = 0x2 Future = 0x4 All = 0x7
假设我收到了两个标志Past和Future(setFlags(PAST | FUTURE)
).我怎么知道它Past
是否在里面?同样,我怎么能告诉它Current
不在其中?这样我就不必测试每种可能的组合.
如果您希望测试掩码中的所有位匹配:
if((value & mask) == mask) {...}
如果您希望测试掩码中的任何一个位匹配:
if((value & mask) != 0) {...}
当您测试多个事物的值时,差异最明显.
要测试排除:
if ((value & mask) == 0) { }
首先 - 使用带有FlagAttribute的枚举.这就是它的用途.
[Flags] public enum Time { None = 0 Current = 1, Past = 2, Future = 4 All = 7 }
然后测试就像这样:
if ( (x & Time.Past) != 0 )
或这个:
if ( (x & Time.Past) == Time.Past )
如果"过去"是旗帜的组合并且您想要测试它们,后者将更好地工作.
设置是这样的:
x |= Time.Past;
取消设置是这样的:
x &= ~Time.Past;
您可能还需要添加一个扩展方法是这样
enum states { Current = 0x1, Past = 0x2, Future = 0x4, All = 0x7 }; static bool Is(this states current, states value) { return (current & value) == value; }
然后你可以这样做:
if(state.Is(states.Past)) { // Past }