Java中的管道(|)运算符

Java中的管道(|)运算符,java,operators,Java,Operators,我用Java编写了以下语句: System.out.println(3|4); 为什么输出是7?它正在执行一个按位或操作,3或4是7 请看这里: 这是一个按位OR运算。它是在二进制级别修改内容 011 3 in binary: | 100 in decimal: | 4 ___ ___ 111

我用Java编写了以下语句:

System.out.println(3|4); 

为什么输出是7?

它正在执行一个
按位或
操作,3
4是7

请看这里:
这是一个按位OR运算。它是在二进制级别修改内容

             011                     3
in binary: | 100     in decimal:  |  4
             ___                   ___
             111                     7
使用科学模式打开Windows calc。您可以在十进制和二进制(以及十六进制)之间切换,并执行位操作,包括or、and、xor等


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

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

以下是
3 | 4
的工作原理:

  3:  00000011
  4:  00000100
--------------
3|4:  00000111 = 7
|是“按位或”运算符。在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的二进制表示。

二进制表示:

 3 = 00000011
 4 = 00000100

| is bitwise OR operator
当输入两个或两个数字时,采用二进制表示,OR结果是该列的1 IFF至少有一列设置为真(1)

所以

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

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

任何带1的列都表示添加该列的值:

4 + 2 + 1 = 7

由于位运算符可能会有点混淆,没有什么东西可以将它们关联起来,因此我向非程序员解释它们的功能的方式是,您只需将1替换为true,0替换为false,然后它们的行为与英语中的运算符相同:

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

0和1是0

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

0或1是1

但当我谈到以下问题时,这种类比就不成立了:


海洋是蓝色的,树木是绿色的,是假的。认识到这背后有一个通用的计数系统是很有用的。二进制是以2为基数的。大家熟悉的十进制是以10为基数的。Linux权限八进制是基数8

一个数字的值是通过将每个数字的各个值相加得到的。对于任何数字,该值都是从一个简单的公式推导出来的

(位数)*(基数)^(小数点左边的位数)

123=123=(1*10^2)+(2*10^1)+(3*10^0)=100+20+3


我在CS211中学到了这一点(不是吹牛,只是记住)

的确如此。稍微扩展一下dcp的解释,在Java中,单个管道,
|
,就是所谓的“按位OR”。这意味着它在组成参数的实际位上执行低电平或低电平。在这种情况下,3为
0011
,4为
0100
(显示的有效位至少为4位)。按位OR遍历每个位,如果其中任何一位为1,则将其设置为1,因此在本例中,您将得到
0111
,或7。你到底想打印什么,或者这是一本书/教程中的一个例子?-1:SO的目的是创建最终答案。这并不能解释为什么
3 | 4==7
@Tim:给出一个有用且正确但不完美/完整的答案绝不违背“SO的目的”。@Tim Bender-我为他提供了一个关于OR操作如何工作的链接,如果阅读该链接,将详细解释操作,以便他能够理解它。不管怎样,如果有什么不正确的地方,你应该投否决票,但没有什么不正确的地方,所以我很困惑。@dcp,很抱歉你不同意。我个人的观点是,简单地说“3或4等于7”是一个递归定义。这根本不能解释为什么会这样。如果你想提供链接来扩展你的答案,那就太棒了。但你的答案也应该是明确和完整的。只是我个人的意见。另请参见:+1:演示
12 | 10
可能是位or运算符的更全面的示例。虽然这里的OP特别询问关于
3 | 4
你期望什么?为什么?@EJP:在编程语言中使用运算符表示法的目的是使我们能够在程序中使用我们余生使用的相同表示法。竖条的意思通常是可以被整除的,所以虽然我不能代表OP,但我自己认为
3 | 4
的结果是
false
,而不是
7
,我怀疑几乎所有在高中学数学的人都会有同样的期望。在这里,在美国,Java是专门设计的,竖条与除法无关。我们使用单杠(有时上面和下面都有点),很少使用正斜杠。从来没有一条垂直线。@Brian,我想这是德国人的一种特质,但仔细看,也许不是:(寻找“可分性”)。但它也绝对不是外行的数学符号。:)|运算符的用途是语言规范所说的。不符合您的期望。为了解释XOR,类似于“您想要冰淇淋XOR蛋糕作为甜点吗?”的内容可能是说明性的:“自然语言”或“实际上意味着“两者中的一个,但不是两者”的典型情况。
128, 64, 32, 16, 8, 4, 2, 1
 0 ,  0,  0,  0, 0, 1, 1, 1  
4 + 2 + 1 = 7