【问题标题】:Why don't Java logical operators && and || work with arrays?为什么 Java 逻辑运算符 && 和 ||使用数组?
【发布时间】:2013-12-22 19:08:16
【问题描述】:

我正在有效地尝试以二进制形式编写多位 if 语句。如果 val 为真,我想返回 x 的正确值。但是,如果 val 为假,我想将数组的所有值都返回为假。 这实际上与根据 val 的值检查数组中的所有值相同。为什么这不起作用?

boolean[] ifStatement(bit0, bit1, bit2, bit3, val) {
    boolean[] x = {bit0, bit1, bit2, bit3};
    return (x && val);
}

在回答 cmets 问我的问题是什么意思时,以下是在程序 Logisim 中使用 8 位与门的表示:

我也知道使用 for 语句很容易做同样的事情。我的问题是为什么示例代码不可能?

提前致谢。

【问题讨论】:

  • 因为boolean[] 不是boolean...
  • 请查看您所询问的运算符可接受的操作数。
  • 试试for(int i = 0; i < x.lenght(); i++) if(x[i] != val) return false; return true
  • 你不能问“为什么它起作用”,直到你至少有一个论据的草图应该起作用。
  • @MarkoTopolnik:为了公平起见,这个标题实际上是被编辑的。

标签: java binary boolean logic


【解决方案1】:

简短的回答是否定的。您已检查每个项目。如果它确实有效,那就太好了,但你有它。

然而,像BitSet 这样的特殊类为大型布尔值集合提供了特殊功能。您可能会发现其中一种很有用。不过,通常不值得为少量布尔值付出努力。

【讨论】:

    【解决方案2】:
    boolean[] x = {bit0, bit1, bit2, bit3};
    return (x && val);
    

    为什么这不起作用?

    您提出的该表达式的含义与 FP 范式中标准 map 高阶函数的语义相匹配。有趣的是,我不知道任何实际的 FP 语言在其操作数之一是集合时会将其 AND 运算符重载为表示 map((applyPartial(AND, val), coll)

    但是,将讨论限制在 Java 上,这样的功能将与其中的所有其他功能大相径庭。它会使 logical 操作符突然表现得像批处理操作符; 没有任何东西与 Java 中的语言相近,这意味着对初学者来说尽可能地不足为奇,尤其是对于已经熟悉 C 的人来说。

    顺便说一句,您至少应该选择&,因为&& 具有短路语义,这在您的提案中毫无意义。

    【讨论】:

      【解决方案3】:

      数组本身就是一个类型,而不是boolean。所以你不能在数组类型上使用逻辑运算符。

      根据您的问题描述,听起来您只是想根据某个基线布尔值检查数组中的每个值。您可以对数组中的所有元素进行循环,如果有任何元素与基线不匹配,则返回 false。

      public boolean ifStatement(boolean base, boolean... values) {
          for(boolean value : values) {
              if(!(value && base)) {
                  return false;
              }
          }
          return true;
      }
      

      编辑:在您的图表解释了一些事情之后,布尔数组似乎是错误的数据结构。为什么不直接使用字节? (8 位 = 1 字节)

      public byte ifStatement(boolean val, byte value) {
          return val ? value : (byte) 0x00;
      }
      

      在您的示例中,您要么返回值,要么什么都不返回,所以我相信这会更好。

      【讨论】:

        【解决方案4】:

        这不起作用,因为 Java 编译器不会解释您的意愿,而是遵守其规范。

        而且布尔运算符只适用于布尔值。布尔数组不是布尔值。

        【讨论】:

          【解决方案5】:

          其实你不需要循环/位操作符:

          boolean []ifStatement(boolean b1, boolean b2, boolean b3, boolean b4, boolean val) {
              if (!val) {
                  boolean []result = {false, false, false, false};
                  return result;
              } else {
                  boolean []result = {b1, b2, b3, b4};
                  return result;
              }
          }
          

          【讨论】:

          • 是的,我想过这样做,但不幸的是,我的项目的重点是仅使用布尔变量和运算符 && 和 ||。好的答案,谢谢。
          • 我会考虑将所有布尔值打包成一个 byte/int/long 并使用:return bvals & (val ? 0xFFFFFFFF : 0);
          猜你喜欢
          • 1970-01-01
          • 2014-01-01
          • 2012-12-16
          • 2015-07-03
          • 2010-10-29
          • 2014-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多