在Java XOR中,三个真实输入返回true.为什么?

par*_*ier 12 java logic xor

以下代码

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));
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

true当所有三个输入都是true?时,为什么XOR会返回?

如果它是有效的逻辑,我怎样才能实现true 在其中一个输入元素返回时返回的逻辑true(无论我提供多少输入)?

Gon*_*alo 17

如果您想要一个真实的结果,如果只有一个输入为真,您可以使用:

(a ^ b ^ c ) ^ ( a && b && c )
Run Code Online (Sandbox Code Playgroud)

测试用例结果:

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
Run Code Online (Sandbox Code Playgroud)


Cod*_*key 11

因为true xor true = false,false xor true为true.xor是关联的,因此您可以按照自己喜欢的方式对值进行分组!

要确定其中只有一个为真,您可以将这些值一起作为整数添加,并查看答案是否为1.

我回答这是一个通用的编程问题,它确实不是Java特有的.


Dav*_*vio 8

这是一种确定一个布尔值是否为真的 Java 8 方法:

Stream.of(b1, b2, b3, ...)
        .filter(b -> b)
        .count() == 1;
Run Code Online (Sandbox Code Playgroud)


Boh*_*ian 6

想想编译器如何评估这个:

(true ^ true) ^ true
Run Code Online (Sandbox Code Playgroud)

第一项后true ^ true,这是false已被评估:

(false) ^ true ==> true
Run Code Online (Sandbox Code Playgroud)