.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 个问题:
- 每个带有 BitFlags 的 Enum 中可以有多少个元素?
- 我假设
Long
它必须是 64 – 那么我怎样才能在我的列表中获得正确的“组”?
非常感谢您的回答。
弗雷德
ITEM32
、ITEM33
和 ITEM34
具有值 0
、1
和 2
,因为移位运算符屏蔽了整数的右操作数为五位:
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)
...
因此您需要更改声明如下:
ITEM31 = 1 << 31
ITEM32 = 1L << 32
ITEM33 = 1L << 33
ITEM34 = 1L << 34
这将使移位运算符成为 Long
移位运算符,从而允许您指定的移位量。
我正在使用 [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 个问题:
- 每个带有 BitFlags 的 Enum 中可以有多少个元素?
- 我假设
Long
它必须是 64 – 那么我怎样才能在我的列表中获得正确的“组”?
非常感谢您的回答。
弗雷德
ITEM32
、ITEM33
和 ITEM34
具有值 0
、1
和 2
,因为移位运算符屏蔽了整数的右操作数为五位:
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)
...
因此您需要更改声明如下:
ITEM31 = 1 << 31
ITEM32 = 1L << 32
ITEM33 = 1L << 33
ITEM34 = 1L << 34
这将使移位运算符成为 Long
移位运算符,从而允许您指定的移位量。