我正在读取一个二进制文件,其值存储在位掩码中,包括1个字节位掩码和2个字节位掩码。掩码中的每个位都充当一个开关,指示事件发生的位置。
1个字节掩码的示例:
00000101
表示事件一和事件 3已经发生了。
Enum
的示例public enum MyEnum
{
EventOne,
EventTwo,
....;
}
我已经在事件中创建了Enum MyEnum
(根据Effective java, Second Edition中的第32项)。如何将二进制位掩码读入EnumSet<MyEnum>
?
答案 0 :(得分:4)
List<MyEnum> list = new ArrayList<MyEnum>();
for (MyEnum value : MyEnum.values()) {
if ((mask & (1 << value.ordinal())) != 0) {
list.add(value);
}
}
return EnumSet.copyOf(list);
对于2字节掩码,将2个字节组合成一个int。例如:
int mask = (((int)hbyte) & 0xff) << 8 | (((int)lbyte) & 0xff);
答案 1 :(得分:1)
我觉得明确地想到
很方便 BIT0 = 1;
BIT1 = 1<<1;
BIT2 = 1<<2;
等
然后
if (bitmask & BIT0)
return EventOne;
if (bitmask & BIT1)
return EventTwo;
等
如果你愿意,你可以为BIT0,BIT1等制作枚举或其他内容(假设所有文档等都与位顺序一致,每个人都可以立即看到你正在选择的位数: ),或直接使用移位表达式(大多数程序员应该知道它意味着什么,但有些可能不会)。
(尽管Laurence Gonsalves的答案很聪明,当每个位都按顺序与其中一个枚举成员对应时;请务必通过它清楚地记录下来。)
答案 2 :(得分:0)
一种方法是拥有两个数组,一个由低字节索引,一个由高字节索引。使用相应的集合填充数组。