4

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

1 字节掩码示例:

00000101

表示事件一和事件三已经发生。

枚举示例

public enum MyEnum 
{
    EventOne,
    EventTwo,
        ....;   
}

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

4

3 回答 3

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);
于 2009-09-30T18:28:27.470 回答
1

我发现明确考虑很方便

 BIT0 = 1;
 BIT1 = 1<<1;
 BIT2 = 1<<2;

等等

然后

  if (bitmask & BIT0)
    return EventOne;
  if (bitmask & BIT1)
    return EventTwo;

等等

如果需要,您可以为 BIT0、BIT1 等创建一个枚举或任何内容(假设所有文档等在位顺序方面都是一致的,每个人都可以立即看到您选择的位:),或者直接使用 shift 表达式(大多数程序员应该知道它的含义,但有些可能不知道)。

(虽然当每一位完全对应于一个枚举成员时,Laurence Gonsalves 的回答很聪明;一定要清楚地记录下来。)

于 2009-11-06T17:31:20.037 回答
0

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

于 2009-09-30T18:28:09.647 回答