gpt4 book ai didi

java - 测试无效位标志

转载 作者:行者123 更新时间:2023-11-30 09:27:41 24 4
gpt4 key购买 nike

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

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com