按位(标志)enum指南
老了,但想试着做个小抄,即使是供我自己参考:
Operation |
Syntax |
Example |
On |
|= |
e |= E.A |
Off |
&= + ~ |
e &= ~E.A |
Toggle |
^= |
e ^= E.A |
Test (.NET API) |
.HasFlag |
e.HasFlag(E.A) |
Test (bitwise) |
(see example) |
(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 enum
通常,我们像这样使用整数:
[Flags]
enum E {
A = 1,
B = 2,
C = 4,
// etc.
但当我们接近更大的数字时,计算下一个值就不那么容易了:
// ...
W = 4194304,
X = 8388608,
// ..
然而,有两个替代方案:二进制和十六进制字面量。
对于二进制,只需在前一个值的末尾追加一个0:
[Flags]
enum E {
A = 0b1,
B = 0b10,
C = 0b100,
// ...
W = 0b100_0000_0000_0000_0000_0000,
X = 0b1000_0000_0000_0000_0000_0000,
十六进制也有一个方便的模式,可能看起来不那么丑陋:循环1、2、4、8,在每次完整迭代后加一个0。
[Flags]
enum E {
A = 0x1,
B = 0x2,
C = 0x4,
D = 0x8,
E = 0x10, // 16
F = 0x20, // 32, etc.
// ...
W = 0x400000,
X = 0x800000,