java - 测试无效位标志

标签 java bit-manipulation flags

我正在使用位标志从字节读取用户提供的选项。我想检查该字节是否包含任何无效/未知的标志值。

到目前为止我编写的快速测试代码如下所示:

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);
  }
}

这看起来工作正常。但是,有人知道吗:

  • 有更简洁的方法吗?无论如何,我都不是一个操纵专家。

  • 是否有现有的库来处理标志操作?我找到了BitField来自 Apache Commons Lang,但已经有一个 bug 提示如何 impossible the JavaDocs are to read .

最佳答案

您应该使用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(...)byte数组创建BitSet。请参阅 JavaDoc 了解更多信息。

关于java - 测试无效位标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14426587/

相关文章:

java - 需要使用selenium从多个网页捕获数据

java - 无法在SpringRunner中创建环境bean

c++ - 字符的位表示 C++

android - 用于在 Android 中启动新 Activity 的多个 Intent 标志

javascript 测试是否存在两个标志中的任何一个

java - 每次使用后不关闭 DefaultHttpClient() 的解决方法

java - java 中的应用程序配置(默认)

c - 为什么此代码片段的输出为 -33

c++ - 计算莫顿码

Perl "-C"标志问题