将两个字节位掩码转换为EnumSet

时间:2009-09-30 18:20:09

标签: java bitmask enumset

我正在读取一个二进制文件,其值存储在位掩码中,包括1个字节位掩码和2个字节位掩码。掩码中的每个位都充当一个开关,指示事件发生的位置。

  

1个字节掩码的示例:

00000101
     

表示事件一和事件   3已经发生了。

Enum

的示例
public enum MyEnum 
{
    EventOne,
    EventTwo,
        ....;   
}

我已经在事件中创建了Enum MyEnum(根据Effective java, Second Edition中的第32项)。如何将二进制位掩码读入EnumSet<MyEnum>

3 个答案:

答案 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)

一种方法是拥有两个数组,一个由低字节索引,一个由高字节索引。使用相应的集合填充数组。