【问题标题】:convert a two Byte bit mask into a EnumSet将两个字节的位掩码转换为 EnumSet
【发布时间】:2010-12-02 18:12:36
【问题描述】:

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

1 字节掩码示例:

00000101

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

枚举示例

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

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

【问题讨论】:

    标签: java bitmask enumset


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      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);
      

      【讨论】:

      • 不应该更像 if ((mask & (1
      • 我将字节作为短字节提取,因此我能够将掩码缩短为 int mask = (hbyte
      • 最好在枚举中有一个字段指示枚举值对应的位。使用序数有点脆弱:如果有人重新排序值声明,程序就会中断。有一个单独的字段可以更好地显示您的意图。
      【解决方案3】:

      我觉得明确地考虑很方便

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

      等等

      然后

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

      等等

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

      (尽管 Laurence Gonsalves 的回答很聪明,因为每个位都按顺序与枚举成员之一完全对应;请务必清楚地记录下来。)

      【讨论】:

        猜你喜欢
        • 2021-07-15
        • 2017-03-16
        • 2011-06-18
        • 2020-12-22
        • 2012-06-06
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多