【问题标题】:Pipe (|) operator in JavaJava 中的管道 (|) 运算符
【发布时间】:2011-03-19 18:18:44
【问题描述】:

我在 Java 中有这个语句:

System.out.println(3|4); 

为什么输出是 7?

【问题讨论】:

  • 您期待什么?为什么?
  • @EJP:在编程语言中使用运算符符号的目的是使我们的程序中使用与我们在余生中使用的相同符号成为可能。竖线通常表示 可被整除,所以虽然我不能代表 OP,但我自己希望 3|4 的结果是 false 而不是 7 我怀疑几乎所有在高中学习数学的人都会有同样的期望。
  • 在美国,Java 被规范,竖线与除法没有任何关系。我们使用水平条(有时在上方和下方带有点),在极少数情况下使用正斜杠。绝不是垂直线。
  • @Brian,我以为那是德国人的一些特质,但仔细观察,可能不是:en.wikipedia.org/wiki/Vertical_bar#Mathematics(寻找“可分割性”)。但它也绝对不是外行的数学符号。 :)
  • 的目的|运算符就是语言规范所说的那样。不符合您的期望。

标签: java operators


【解决方案1】:

这是一个按位或运算。它在二进制级别上进行修改。

             011                     3
in binary: | 100     in decimal:  |  4
             ___                   ___
             111                     7

使用科学模式打开 Windows calc。您可以在十进制和二进制(和十六进制)之间切换并执行按位运算,包括或、与、异或等。

要按位或在头脑中或在纸上进行,请比较相同序数的每个数字。如果任一数字为 1,则该序数的结果将为 1。

【讨论】:

    【解决方案2】:

    运算符| 执行“按位或”。如果任一位为 1,则两个位上的按位或输出为 1;如果两个位均为 0,则输出为 0。对两个数字进行按位或仅对每个位进行按位或。

    3|4 的工作原理如下:

      3:  00000011
      4:  00000100
    --------------
    3|4:  00000111 = 7
    

    【讨论】:

    • +1: 演示 12|10 可能是位或运算符的更详尽示例。尽管这里的 OP 专门询问了 3|4
    【解决方案3】:

    它正在做一个bitwise OR 操作,而 3 OR 4 是 7。

    请看这里: http://en.wikipedia.org/wiki/Bitwise_OR#OR

    【讨论】:

    • 确实如此。为了稍微扩展 dcp 的解释,在 Java 中,单个管道 | 就是所谓的“按位或”。这意味着它对构成参数的实际位执行低级 OR。在这种情况下,3 是 0011,4 是 0100(显示了最少 4 个有效位)。如果 either 位为 1,则按位 OR 遍历每个位并将其设置为 1,因此在这种情况下,您会得到 0111,或 7。您实际上想打印什么,或者这是书籍/教程中的一个例子?
    • -1:SO 的目的是创建明确的答案。这并不能解释为什么3|4 == 7
    • @Tim:给出一个有用且正确但不完美/完整的答案绝不违反“SO的目的”。
    • @Tim Bender - 我为他提供了 OR 操作如何工作的链接,如果阅读该链接,将详细解释该操作,以便他理解。无论如何,如果有什么不正确的地方,你应该投反对票,但那里没有什么不正确的,所以我很茫然。
    • @dcp,很抱歉你不同意。我个人的看法是,简单地说“3 OR 4 is 7”是一个递归定义。它根本没有解释为什么会这样。如果您想提供扩展答案的链接,那就太好了。但你的答案也应该是确定的和完整的。只是我个人的看法。另请参阅:meta.stackexchange.com/questions/8724/…
    【解决方案4】:

    二进制表示:

     3 = 00000011
     4 = 00000100
    
    | is bitwise OR operator
    

    当您对两个数字进行或运算时,您采用二进制表示,并且该列的 OR 结果为 1 IFF,至少有一列设置为 true (1)

    所以

    00000011
    00000100
    --------
    00000111
    

    然后,列会告诉您该位置的值:

    128, 64, 32, 16, 8, 4, 2, 1
    

    所以

    128, 64, 32, 16, 8, 4, 2, 1
     0 ,  0,  0,  0, 0, 1, 1, 1  
    

    任何带有 1 的列都意味着您添加了该列的值:

    4 + 2 + 1 = 7
    

    【讨论】:

      【解决方案5】:

      |是“按位或”运算符。在 a|b 中,如果 a 和/或 b 的第 n 位为 1,则结果的第 n 位将为 1。 3 是二进制的 11。 4 是二进制的 100。

      0  1  1
      or or or
      1  0  0
      =  =  =
      1  1  1
      

      而 111 恰好是 7 的二进制表示。

      【讨论】:

        【解决方案6】:

        意识到有一个通用的计算系统是很有用的。二进制是base-2。熟悉的小数是以 10 为底的。 Linux 八进制权限以 8 为基数。

        一个数字的值是通过将每个数字的单个值相加得到的。对于任何数字,其值都来自一个简单的公式。

        (digit) * (base) ^ (小数点左边的位数)

        123 = 一百二十三 = (1 * 10^2) + (2 * 10^1) + (3 * 10^0) = 100 + 20 + 3

        我在 CS211 中学到的(不是吹牛,只是记住)

        【讨论】:

          【解决方案7】:

          由于位运算符在没有相关内容的情况下可能会有点令人困惑,因此我向非程序员解释它们的功能的方式甚至是您只需将 1 替换为 true,将 0 替换为 false,然后它们的行为与英语操作员:

          月亮是蓝色的,天空是蓝色的,是假的

          0 和 1 是 0

          月亮是蓝色的或天空是蓝色的,是真的

          0 或 1 是 1

          但当我谈到:

          海洋是蓝色的 XOR 树是绿色的,是假的

          【讨论】:

          • 解释异或,比如“你想吃冰淇淋异或蛋糕做甜点吗?”可能是说明性的。 :) 自然语言“或”实际上表示“两者之一但不是两者”的典型情况。
          【解决方案8】:

          由于问题询问 Java 中的管道运算符 (|) 是什么,但没有具体说明任何有关“或”逻辑的内容,因此需要注意的是,当我们处理异常时,可以说这个运算符是重新定义的.

          从 Java SE 7 开始,在一个 catch 块中捕获多个不相交的没有继承关系的类型 异常,还涉及 | 运算符,在这种情况下,它仅用作管道/链接逻辑,与“OR”无关,因为在“OR”的情况下,允许不相交。

          如果在 Java 7 之前,当您需要捕获多个异常时,您需要编写单独的 catch 块,从 Java 7 开始,您可以这样做:

          try {
             ...
          } catch (FileNotFoundException | SQLException e) {
             ...
          }
          

          【讨论】:

            猜你喜欢
            • 2013-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多