按位 ( Flags
) 枚举指南
旧的,但想试一试备忘单,即使是为了我自己的参考:
手术 |
句法 |
例子 |
上 |
|= |
e |= E.A |
离开 |
&= +~ |
e &= ~E.A |
切换 |
^= |
e ^= E.A |
测试(.NET API) |
.HasFlag |
e.HasFlag(E.A) |
测试(按位) |
(见例子) |
(e & E.A) == E.A |
例子
[Flags]
enum E {
A = 0b1,
B = 0b10,
C = 0b100
}
E e = E.A; // Assign (e = A)
e |= E.B | E.C; // Add (e = A, B, C)
e &= ~E.A & ~E.B; // Remove (e = C) -- alt syntax: &= ~(E.A | E.B)
e ^= E.A | E.C; // Toggle (e = A)
e.HasFlag(E.A); // Test (returns true)
// Testing multiple flags using bit operations:
bool hasAandB = ( e & (E.A | E.B) ) == (E.A | E.B);
奖励:定义一个Flags
枚举
通常,我们使用这样的整数:
[Flags]
enum E {
A = 1,
B = 2,
C = 4,
// etc.
但是当我们接近更大的数字时,计算下一个值并不容易:
// ...
W = 4194304,
X = 8388608,
// ..
但是,有两种选择:二进制和十六进制文字。
对于Binary,只需0
在前一个值的末尾附加 a :
[Flags]
enum E {
A = 0b1,
B = 0b10,
C = 0b100,
// ...
W = 0b100_0000_0000_0000_0000_0000,
X = 0b1000_0000_0000_0000_0000_0000,
Hexidecimal也有一个方便的模式,可能看起来不那么难看:循环 1、2、4、8,在每次完整迭代后添加一个零。
[Flags]
enum E {
A = 0x1,
B = 0x2,
C = 0x4,
D = 0x8,
E = 0x10, // 16
E = 0x20, // 32, etc.
// ...
W = 0x400000,
X = 0x800000,