java - 使用二元运算查明 int 是否包含枚举集中的元素

标签 java enums binary-operators

我正在使用一个库,它通过像这样对它们的值进行或运算来连接一个或多个枚举:

    TestEnum {
        VAL1(0x00000001),
        VAL2(0x00000002),
        VAL3(0x00000100),
        VAL4(0x00000200),
        VAL5(0x00000400),
        VAL6(0x00000800),
        VAL7(0x00001000),
        VAL8(0x00002000),
        VAL9(0x00004000),
        VAL10(0x00008000),

        // special values
        VAL11(0x00000000),
        VAL12(0x00000010),
        VAL13(0x00000020),
        VAL14(0x00000030);

        private static final Map<Integer, TestEnum> TEST_ENUM_MAP;

        // constructor, populate map etc.

        public static TestEnum fromValue(final int value) {
            return TEST_ENUM_MAP.get(value);
        }
    }

    int valuesAsInt = 0;

    for (TestEnum testEnum : TestEnum.values()) {
        valuesAsInt |= testEnum.getValue();
    }

我需要提取组合生成 valueAsInt 的枚举,请记住:

  • int 必须包含特殊枚举值之一 (0x00000000...0x00000030)
  • int 可以包含零个或多个非特殊枚举值。

这是我做的:

 private static final int MASK_FOR_SPECIAL_ENUMS = 0x000000FF;

 private static final ImmutableSet<TestEnum> SPECIAL_ENUMS = ImmutableSet.copyOf(Sets.newHashSet(TestEnum.VAL11, TestEnum.VAL12, TestEnum.VAL13, TestEnum.VAL14));

 private void lookupTestEnums(final int valueAsInt) {

      TestEnum testEnum = TestEnum.fromValue(valueAsInt & MASK_FOR_SPECIAL_ENUMS);
    if (testEnum == null || !SPECIAL_ENUMS.contains(testEnum)) {
        throw new ExceptionType("");
    }
 }

仅仅与掩码进行 ANDing 是不够的,因为它会返回 TestEnum 值、VAL1 (0x00000001) 等的正结果。

有更好的方法吗?

最佳答案

看来您的 MASK_FOR_SPECIAL_ENUMS 必须等于 0x000000F0不是 0x000000FF

然后,在检查有效性后,您的查找方法需要循环遍历值 VAL1 到 VAL10,并收集匹配的值。

换句话说,像这样:

private static final int SPECIAL_MASK = 0x000000F0;

int specialValue = valueAsInt & SPECIAL_MASK;
int nonSpecialBits = valueAsInt & ~SPECIAL_MASK;
for (TestEnum testEnum : TestEnum.values()) 
{
    int value = testEnum.getValue();
    if( (value & SPECIAL_MASK) != 0 )
        continue; //this is one of the special values; ignore.
    if( (value & nonSpecialBits) == value )
        collection.add( testEnum );
}

关于java - 使用二元运算查明 int 是否包含枚举集中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42510804/

相关文章:

java - 如何在 Google-App 上允许快速发布请求?

java - 如何定义unix权限常量(READ、WRITE、EXECUTE)

java - 为什么这个 Java Switch-Case 不起作用?

具有隐式解包可选的 Swift 一元运算符

java - 使用 PImage 获取最新的文件夹(处理)

java - Spring 托 : uploading large files (1GB) via rest controller

java - 有点迷路…… jackson 反序列化

c# - 如何通过解析具有相同命名常量的另一个枚举来获取枚举值

java - 验证@RequestParam 在枚举列表中

wcf - 底层连接已关闭 : The connection was closed unexpectedly