【问题标题】:Bitwise operation Java AND multiple booleans按位运算 Java AND 多个布尔值
【发布时间】:2011-06-21 18:37:47
【问题描述】:

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

即没有选项(全部为假) 仅选项 1 选项 1 和选项 2 选项 1 和选项 2 和选项 3 仅选项 2 选项 2 和选项 3 仅选项 3 等等

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

有没有一种方法可以得到应该得到的结果 是吗?

类似

result = option1 & option2 & option3

然后我可以在 switch 语句中 处理正确的组合

如果您需要更详细的解释,请告诉我。 提前致谢。

附言我在这里要做的是避免 这么多 if else if 语句并使我的代码看起来 更干净,设计更好。所以如果你能想到 另一种方法,我将不胜感激。

谢谢

【问题讨论】:

  • 按位运算是对每个位执行运算的运算,例如 5 AND 3 == 1。布尔运算是对布尔运算的运算。
  • 如果我使用整数而不是布尔值怎么办?会不会更好/
  • 我主要是在评论您的标签,整数的唯一区别是它允许紧凑存储和在一台机器操作中进行多个相同的操作。但是,如果您完全了解实现,我只会切换到它们。

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


【解决方案1】:

您可以为每个可能的结果生成一个Karnaugh_map,使用它的规则,您可以简单地将一组特定条件的逻辑降至最低。

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

【讨论】:

    【解决方案2】:

    在一个 switch 中获取所有 8 个 case 的一种方法如下。

    将布尔值转换为不同的 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 种情况。但是,如果添加更多布尔值,它将变得失控,因为组合的数量呈指数增长。

    【讨论】:

      【解决方案3】:

      我的解决方案不适用于布尔值,但您可以调整它。例如调用 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);
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-16
        • 2017-01-11
        • 2013-06-06
        • 1970-01-01
        • 2011-09-11
        • 2013-03-02
        • 1970-01-01
        • 2015-10-22
        相关资源
        最近更新 更多