2015-12-03 39 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。