2011-06-03 119 views
9

下面的代碼在具有三個真實輸入的Java XOR中返回true。爲什麼?

System.out.println("1 0 0: " + (true^false^false)); 
System.out.println("1 0 1: " + (true^false^true)); 
System.out.println("1 1 0: " + (true^true^false)); 
System.out.println("1 1 1: " + (true^true^true)); 
System.out.println("0 0 0: " + (false^false^false)); 
System.out.println("0 0 1: " + (false^false^true)); 
System.out.println("0 1 0: " + (false^true^false)); 
System.out.println("0 1 1: " + (false^true^true)); 

輸出:

1 0 0: true 
1 0 1: false 
1 1 0: false 
1 1 1: true 
0 0 0: false 
0 0 1: true 
0 1 0: true 
0 1 1: false 

爲什麼XOR返回true當所有三個輸入都是true

如果這是我如何可以實現返回true只有如果輸入要素之一是true(不管有多少投入提供)邏輯有效的邏輯?

+1

'真真正^^TRUE'可以(諒解)爲'被寫入(真^真)^ TRUE'這是TRUE;。 – 2011-06-03 01:46:32

回答

10

如果你想有一個真正的結果,如果有且只有一個輸入是真實的,你可以使用:

(a^b^c)^(a && b && c) 

測試用例結果:

true true true = false 
true true false = false 
true false true = false 
true false false = true 
false true true = false 
false true false = true 
false false true = true 
false false false = false 
11

因爲true xor true = false,false xor true爲true。 xor是聯想性的,所以你可以任意組合值!

決定,其中只有一個是真的,你可以爲整數一起添加值,看看答案是1

我回答這個作爲一個一般的編程問題,它真的不是特別針對Java。

+1

我喜歡將數值相加的想法,謝謝! – parxier 2011-06-03 01:59:20

+0

我剛剛意識到'org.apache.commons.lang.BooleanUtils#xor(boolean [])'正是我所需要的。無論如何,謝謝你的想法! – parxier 2011-06-03 02:03:31

5

想想編譯器是如何評價的:

(true^true)^true 

後第一項true^true,這是false,被評價:

(false)^true ==> true 
2

'^' 是一個二元邏輯運算符,而不是n元操作員。

3

true^true^true可以寫作(理解)爲(true^true)^true這是true

如果A,B,C是輸入,你正在尋找的邏輯,你需要像這樣

(A & !B & !C) | (!A & B & !C) | (!A & !B & C) 
+0

好的。它是最短的表達式嗎?真的嗎? :-) – parxier 2011-06-03 01:53:05

+0

這是我能想到的。我不知道如何簡化。 – 2011-06-03 01:54:30

+0

A?b?false:!c:b?!c:c也許?或者一個?!(b || c):b^c – mvds 2011-06-03 02:05:40

0

我不知道是不是發現和強調,但我注意到如果我們將所有值相加(無論有多少),並查看除以2後剩下的內容,我們可以注意到如果0離開,結果爲false,如果1離開,則返回true

例子:

1^0^1^1 = 1(1+0+1+1)%2 = 1

他們是相同的。 請更正或引導我對此案有任何線索的人。

1

下面是確定一個Java 8的方式,如果只有一個布爾值爲true:

Stream.of(b1, b2, b3, ...) 
     .filter(b -> b) 
     .count() == 1; 
相關問題