2

ビットフラグを使用して、バイトからユーザー指定のオプションを読み取っています。バイトに無効/不明なフラグ値が含まれているかどうかを確認したい。

これまでに書いた簡単なテスト コードは次のようになります。

public class Test {
  static byte flag1 = 0x01;
  static byte flag2 = 0x02;
  static byte flag3 = 0x04;

  public static void main(String[] args) {
    byte invalidFlags = 0x0F;
    byte goodFlags = (byte) (flag1 | flag2);

    System.out.println(flagsAreOK(invalidFlags));
    System.out.println(flagsAreOK(goodFlags));

    // prints:
    //
    // false
    // true
  }

  private static boolean flagsAreOK(byte value) {
    byte allFlags = (byte) (flag1 | flag2 | flag3);
    byte badFlags = (byte) ~allFlags;

    return ((value & badFlags) == 0);
  }
}

これは問題なく動作するようです。ただし、次のいずれかを知っている人はいますか。

  • これを行うためのよりきちんとした方法はありますか?私は決してビット操作の専門家ではありません。

  • フラグ操作を処理する既存のライブラリ? Apache Commons Lang から見つけましたが、JavaDocs を読むことがBitFieldいかに不可能であるかについて不平を言うバグが既にあります。

4

1 に答える 1

2

を使用する必要がありますBitSetが、使用している方法は、有効なフラグのみが設定されているかどうかを確認する正しい方法です。

あなたの例は変更されました:

public class Test {
  static BitSet flag1 = new BitSet();
  static BitSet flag2 = new BitSet();
  static BitSet flag3 = new BitSet();

  public static void main(String[] args) {
    flag1.set(0, true);
    flag2.set(1, true);
    flag3.set(2, true);

    BitSet invalidFlags = new BitSet();
    invalidFlags.set(0, 3, true);
    BitSet goodFlags = new BitSet();
    goodFlags.or(flag1);
    goodFlags.or(flag2);

    System.out.println(flagsAreOK(invalidFlags));
    System.out.println(flagsAreOK(goodFlags));
  }

  private static boolean flagsAreOK(BitSet value) {
    return value.get(0, value.length()).clear(0, 2).cardinality() == 0;
  }
}

を使用して、 の配列からBitSet.valueOf(...)を作成できます。詳細については、JavaDoc を参照してください。BitSetbyte

于 2013-01-20T16:36:52.453 に答える