2011-06-03 114 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; 
相关问题