按位操作Java和多个布尔值

时间:2011-06-21 18:37:47

标签: java bitwise-operators bitwise-and bit-shift

这是我的问题。我有三个布尔 是我可以拥有的选择。我可以有多个 与三个选项的组合:

即。没有选项(全是假的) 仅限选项1 选项1和选项2 选项1和选项2和选项3 仅限选项2 选项2和选项3 仅限选项3 等

我需要检查所有组合,但我没有 我想写一大堆if else if语句。

有没有办法可以获得结果应该是什么 是

类似

result = option1 & option2 & option3

然后我可以进入switch语句 处理正确的组合

如果您需要更详细的解释,请与我们联系。 提前谢谢。

P.S。我在这里要做的是避免拥有 这么多if if if语句并使我的代码看起来 更清洁,设计更好。所以如果你能想到的话 另一种方式,我很感激。

由于

3 个答案:

答案 0 :(得分:2)

您可以为每个可能的结果生成Karnaugh_map,使用其规则,您可以将特定条件集的逻辑简化为可能的最小值。

但是我认为最好是为了清晰,尝试遵循逻辑流程来解释为什么要采用某些分支。如果它太复杂,可能需要重新考虑情况。

答案 1 :(得分:0)

我的解决方案不适用于布尔值,但您可以调整它。例如,调用Option.CombinedOption.get(Option.ONE,Option.THREE)将返回枚举CombinedOption.OPTION_1_3。

public enum Option {
ONE, TWO, THREE;

public enum CombinedOption {

    ALL_FASLSE(), OPTION_1(ONE), OPTION_1_2(ONE, TWO), OPTION_1_3(ONE,
            THREE), OPTION_1_2_3(ONE, TWO, THREE), OPTION_2(TWO), OPTION_2_3(
            TWO, THREE), OPTION_3(THREE);

    private Set<Option> keySet;

    private CombinedOption(Option... options) {
        if (options != null && options.length > 0)
            keySet = EnumSet.copyOf(Arrays.asList(options));
        else
            keySet = EnumSet.noneOf(Option.class);

    }

    private static final Map<Set<Option>, CombinedOption> optionMapping = new HashMap<Set<Option>, CombinedOption>();

    static {
        for (CombinedOption combined : CombinedOption.values()) {
            optionMapping.put(combined.keySet, combined);
        }
    }

    public static CombinedOption get(Option... options) {
        Set<Option> keySet;

        if (options != null && options.length > 0)
            keySet = EnumSet.copyOf(Arrays.asList(options));
        else
            keySet = EnumSet.noneOf(Option.class);

        return optionMapping.get(keySet);
    }
}

}

答案 2 :(得分:0)

在交换机中获取所有8个案例的一种方法如下:

将布尔值转换为不同的int标志(仅设置一个位的值),将这些值与按位OR组合,然后打开8个可能的值。

int combination = (option1 ? 1 : 0) | (option2 ? 2 : 0) | (option3 ? : 4 : 0);

switch(combination) {
case 0: // !1 && !2 && !3
  ...
break;
case 1: // 1 && !2 && !3
  ...
break;
case 2: // !1 && 2 && !3
  ...
break;
case 3: // 1 && 2 && !3
  ...
break;
case 4: // !1 && !2 && 3
  ...
break;
case 5: // 1 && !2 && 3
  ...
break;
case 6: // !1 && 2 && 3
  ...
break;
case 7: // 1 && 2 && 3
  ...
break;
}

通过这种方法,您可以平等地处理所有8个案例。但如果添加更多的布尔值,它将会失控,因为组合的数量呈指数级增长。