0

[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

现在 – 当我选择 GROUP2 时:而不是给我 ITEM31/32/33/34(4 个项目),我得到 ITEM1/2/31/32/33(5 个项目)......。事实上,就位标志而言,它给了我 1,2、1073741824 和 -2147483648。

所以我有两个问题:

  • 每个带有 BitFlags 的 Enum 中可以有多少个元素?
  • 我假设Long它必须是 64 - 那么我怎样才能在我的列表中获得正确的“组”?

非常感谢您的回答。

弗雷德

4

1 回答 1

2

ITEM32, ITEM33, 并ITEM34具有值0, 1, 和2因为移位运算符将右操作数屏蔽为整数的五位:

为了防止移位超过结果可以容纳的位数,Visual Basic 使用与模式的数据类型相对应的大小掩码来掩码 amount 的值。这些值的二进制 AND 用于移位量。口罩尺寸如下:

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

—<a href="https://msdn.microsoft.com/en-us/library/7haw1dex.aspx" rel="nofollow noreferrer"><< 运算符 (Visual Basic)

因此,您需要按如下方式更改声明:

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

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

于 2016-03-14T06:34:06.530 回答