4

1 バイトのビット マスクと 2 バイトのビットマスクの両方のビット マスクに値が格納されているバイナリ ファイルを読み込んでいます。マスクの各ビットは、イベントが発生した場所を示すスイッチとして機能します。

1 バイト マスクの例:

00000101

イベント 1 とイベント 3 が発生したことを示します。

列挙の例

public enum MyEnum 
{
    EventOne,
    EventTwo,
        ....;   
}

( Effective Java, Second EditionEnum MyEnumの項目 32 に従って) イベントを作成しました。バイナリ ビット マスクを に読み込むにはどうすればよいですか?EnumSet<MyEnum>

4

3 に答える 3

4
List<MyEnum> list = new ArrayList<MyEnum>();
for (MyEnum value : MyEnum.values()) {
  if ((mask & (1 << value.ordinal())) != 0) {
    list.add(value);
  } 
}
return EnumSet.copyOf(list);

2 バイトのマスクの場合、2 バイトを 1 つの int に結合します。例えば:

int mask = (((int)hbyte) & 0xff) << 8 | (((int)lbyte) & 0xff);
于 2009-09-30T18:28:27.470 に答える
1

明示的に考えると便利だと思います

 BIT0 = 1;
 BIT1 = 1<<1;
 BIT2 = 1<<2;

それで

  if (bitmask & BIT0)
    return EventOne;
  if (bitmask & BIT1)
    return EventTwo;

必要に応じて、BIT0、BIT1などの列挙型などを作成できます(すべてのドキュメントなどがビットオーダーについて一貫していると仮定すると、誰もが選択しているビットを一目ですぐに確認できます:)、またはシフト式を直接使用します (ほとんどのプログラマーはそれが何を意味するかを知っているはずですが、一部のプログラマーは知らないかもしれません)。

(ローレンス・ゴンサルベスの答えは、各ビットが列挙型メンバーの 1 つに順番に正確に対応している場合は賢明ですが、それを明確に文書化してください。)

于 2009-11-06T17:31:20.037 に答える
0

1 つの方法は、2 つの配列を使用することです。1 つは下位バイトでインデックス付けされ、もう 1 つは上位バイトでインデックス付けされます。配列に対応するセットを設定します。

于 2009-09-30T18:28:09.647 に答える