[英]In Java XOR with three true inputs returns true. Why?
以下代碼
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
為什么當所有三個輸入都為true
true
如果它是有效邏輯,我如何實現僅當輸入元素之一為true
時才返回true
邏輯(無論我提供多少輸入)?
If you want a true result, if one and only one inputs is true you can use:
(a ^ b ^ c ) ^ ( a && b && c )
the test case result:
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
因為真異或真=假,假異或真為真。 xor 是關聯的,因此可以按您喜歡的方式對值進行分組!
要確定其中只有一個是正確的,您可以將這些值作為整數相加並查看答案是否為 1。
我將其作為一般編程問題來回答,它確實不是 Java 所特有的。
這是確定一個 boolean 是否為真的 Java 8 方法:
Stream.of(b1, b2, b3, ...)
.filter(b -> b)
.count() == 1;
想想編譯器如何評估這個:
(true ^ true) ^ true
在第一項true ^ true
(即false
)被評估后:
(false) ^ true ==> true
true ^ true ^ true
可以(為了理解)寫為( true ^ true ) ^ true
,即為true
。
如果 A、B、C 是輸入,對於您正在尋找的邏輯,您需要這樣的東西
(A & !B & !C) | (!A & B & !C) | (!A & !B & C)
'^' 是二元邏輯運算符,而不是 n 元運算符。
我不知道它是否被發現並突出顯示,但我注意到如果我們將所有值加在一起(無論有多少)並查看除以 2 后剩下的內容,我們可以注意到如果false
0
和如果還剩1
則為true
。
例子:
1 ^ 0 ^ 1 ^ 1 = 1
和(1+0+1+1)%2 = 1
他們是一樣的。 請糾正或指導我誰對此案有線索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.