2015-12-03 34 views
2

我试图评估以下几点:Java:如何在按位异或运算符中评估条件? (^)

  1. System.out.println(""+(3!=3 | 2==2 | 3==1)); - 返回TRUE
  2. System.out.println(""+(3!=3 & 2==2 & 3==1)); - 返回FALSE
  3. System.out.println(""+(3!=3^2==2^3==1)); - 返回TRUE - 如何和为什么?

我的理解:

  1. 将返回true;在第二次比较的基础上(2==2);但它会做所有的比较;不像||哪个只做1个比较并返回结果

  2. 会返回false;即使它在第一次比较中得到结果(3!=3);但它会做所有的比较。不像&&哪个只做1个比较并返回结果

  3. ?它如何评估报表?
+1

这不是你在这里使用的按位运算符,而是逻辑xor;按位异或是另一件事 – fge

+0

3.'false^true^false == true'。所有条件都被评估。 – khelwood

+1

关于数字'^'是按位异或。在布尔值上,这是合乎逻辑的xor。 – khelwood

回答

4
System.out.println(""+(3!=3 | 2==2 | 3==1)); 
// System.out.println(""+(false | true | false)); 
// System.out.println(""+( true  | false)); 
// System.out.println(""+(true)); 
System.out.println(""+(3!=3 & 2==2 & 3==1)); 
// System.out.println(""+(false & true & false)); 
// System.out.println(""+( false & false)); 
// System.out.println(""+(false)); 
System.out.println(""+(3!=3^2==2^3==1)); 
// System.out.println(""+(false^true^false)); 
// System.out.println(""+( true ^false)); 
// System.out.println(""+(true)); 

引用JLS section 15.22.2,并且知道从左至右表达式进行求值:

对于&,结果值是true如果两个操作数的值都true;否则,结果是false

对于^,如果操作数值不同,结果值为true;否则,结果是false

对于|,如果两个操作数值均为false,则结果值为false;否则,结果是true

作为一个侧面说明,正确的名称are

  • &是位睿智。
  • |是按位包含的或。
  • ^是按位独占的。
+0

那么&&和&和||有什么区别?和| – fatherazrael

+1

@fatherazrael如果将它们应用于布尔值,则没有区别。但'&'和'|'也可以应用于数字。 – Tunaki

+0

现在就了解它。只发现1个差异是执行条件及其终止 – fatherazrael

1

据计算,从左至右依次为:

3!=3^2==2false^true这是真的。

true^3==1true^false这是真的。

0

XOR是“独家或声明”。它通常是如何工作的: 把这些2支二进制数:

0 0 1 1 0 1 
0 1 1 0 1 1 
- - - - - - XOR 
0 1 0 1 1 0 

XOR才会返回,如果真的被比较的两个布尔的ONE是真实的。

所以在布尔比较(逻辑表)的情况下:

^| true | false 
---------------------- 
true | false | true 
---------------------- 
false | true | false 

在特定情况下,这是指:

(3!=3^2==2 ^3==1) 
((false^true)^3==1) 
(  true ^3==1) 
(  true ^false) 
true 
0

它是在Java中的按位XOR运算符,这导致1用于不同的比特值(即1^0 = 1),0用于相同的比特值(即0^0 = 0),当数字以二进制形式写入时为0。

首先它评估(3!= 3^2 == 2)这是false,然后false(从前一步)^ false(3 == 1)评估为true。