我正在使用位标志从字节读取用户提供的选项。我想检查该字节是否包含任何无效/未知的标志值。
到目前为止我编写的快速测试代码如下所示:
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/