.NET 枚举和 BitFlags

.NET Enum and BitFlags

我正在使用 [Enum] 作为我页面中特殊模板列表的一部分。

<Flags>
Enum SMARTTAGS As Long
 ITEM01 = 1 << 1
 ITEM02 = 1 << 2
 ITEM03 = 1 << 3
 ITEM04 = 1 << 4
 ITEM05 = 1 << 5
 …
 ITEM31 = 1 << 31
 ITEM32 = 1 << 32
 ITEM33 = 1 << 33
 ITEM34 = 1 << 34
End Enum

为简单起见,[Enum] 重新分组如下;

<Flags>
 Enum SMARTTAGSGROUP As Long
  GROUP1 = ITEM01 OR ITEM02 OR ITEM03 OR … OR ITEM15
  GROUP2 = ITEM31 OR ITEM32 OR ITEM33 OR ITEM34
End Enum

现在 – 当我 select GROUP2 时:而不是给我 ITEM31/32/33/34(4 项),我得到 ITEM1/2/31/32/33(5 项)…。实际上,就位标志而言,它给了我 1,2、1073741824 & -2147483648。

所以我有 2 个问题:

非常感谢您的回答。

弗雷德

ITEM32ITEM33ITEM34 具有值 012,因为移位运算符屏蔽了整数的右操作数为五位:

To prevent a shift by more bits than the result can hold, Visual Basic masks the value of amount with a size mask that corresponds to the data type of pattern. The binary AND of these values is used for the shift amount. The size masks are as follows:

...
Integer, UInteger: 31 (decimal), &H0000001F (hexadecimal)
Long, ULong: 63 (decimal), &H0000003F (hexadecimal)
...

<< Operator (Visual Basic)

因此您需要更改声明如下:

ITEM31 = 1 << 31
ITEM32 = 1L << 32
ITEM33 = 1L << 33
ITEM34 = 1L << 34

这将使移位运算符成为 Long 移位运算符,从而允许您指定的移位量。