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 でした。

だから私は2つの質問があります:

  • BitFlags を使用して各列挙型にいくつの要素を含めることができますか?
  • 私はそれが 64 でなければならないと仮定しLongます - どうすれば私のリストで正しい「グループ」を取得できますか?

ご回答ありがとうございます。

フレッド

4

1 に答える 1

2

ITEM32ITEM33、およびITEM34の値0は 、1、および2です。これは、シフト演算子が右オペランドを整数の 5 ビットにマスクするためです。

結果が保持できるよりも多くのビットによるシフトを防ぐために、Visual Basic は pattern のデータ型に対応するサイズ マスクで amount の値をマスクします。これらの値のバイナリ AND がシフト量に使用されます。マスクのサイズは次のとおりです。

...
IntegerUInteger : 31(10 進数)、&H0000001F(16 進数)
LongULong : 63(10 進数)、&H0000003F(16 進数)
...

—<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 に答える