【发布时间】:2013-01-22 06:38:25
【问题描述】:
我正在使用位标志从一个字节中读取用户提供的选项。我想检查字节是否包含任何无效/未知的标志值。
到目前为止,我编写的快速测试代码如下所示:
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 中找到了
BitField,但已经有一个 bug 抱怨 impossible the JavaDocs are to read 如何。
【问题讨论】:
-
您的标志是否代表一组常量。如果是这样,您可以利用 Java 的
EnumSet和Enum,这可以为您节省大量与位字段相关的工作。 Effective Java 2nd有一个很好的tips。 -
已经很整洁了。使用
int来保存标志将删除强制转换。 -
我看到你的代码是正确的。但是如果你不想计算 0x1、0x2、0x4,你可以做 "flag1 = 1
-
@Genzer 它们代表一组不互斥的选项。我想这排除了
EnumSet? -
@ggrandes 非常好,非常有帮助,谢谢。
标签: java bit-manipulation flags