2011-06-03 7 views
9

El siguiente códigoEn Java XOR con tres entradas verdaderas devuelve verdadero. ¿Por qué?

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)); 

salidas:

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 

¿Por qué XOR vuelve true cuando las tres entradas son true?

Si se trata de la lógica válida cómo puedo implementar una lógica que devuelve trueúnica si uno de los elementos de entrada es true (no importa cuántas entradas proporciono)?

+1

'verdadera^^ verdadera true' se puede escribir (por entender) como' (verdadero^verdadera)^true' cual es 'verdad'. –

Respuesta

10

Si quieres un resultado verdadero si y sólo una entrada es cierto, puede utilizar:

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

El resultado de la prueba caso:

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

Porque true xor true = false, y false xor true is true. xor es asociativo, ¡entonces agrupa los valores de la forma que quieras!

Decidir que sólo uno de ellos es cierto, habría que agregar los valores juntos como números enteros y ver si la respuesta es 1.

Estoy respondiendo esto como una cuestión de programación en general, en realidad no lo es particular a Java.

+1

¡Me gusta la idea de agregar valores juntos, gracias! – parxier

+0

Acabo de darme cuenta de que 'org.apache.commons.lang.BooleanUtils # xor (boolean [])' hace exactamente lo que necesito. ¡Gracias por una idea de todos modos! – parxier

5

pensar en cómo evalúa el compilador esto:

(true^true)^true 

Después primer término true^true, que es false, ha sido evaluada:

(false)^true ==> true 
2

'^' es un operador lógico binario, no un operador n-ary.

3

true^true^true puede escribirse (para su comprensión) como (true^true)^true que es true.

Si A, B, C son entradas, por la lógica que está buscando, necesita algo como esto

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

Ok. ¿Es la expresión más corta ... realmente? :-) – parxier

+0

Esto es lo que pude pensar. No estoy seguro de cómo simplificar eso. –

+0

A? B? False:! C: b?! C: c ¿tal vez? O a?! (B || c): b^c – mvds

0

no sé es lo descubrió y puso de relieve, pero me di cuenta una cosa que si agregamos todos los valores juntos (no importa cuántos hay) y vemos lo que queda después de la división por 2 podemos notar que el resultado es false si 0 salió y true si 1 izquierda.

Ejemplo:

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

Ellos son los mismos. Por favor, corrígeme o guíame quién tiene una pista sobre este caso.

1

Aquí está una manera de Java 8 de determinar si exactamente un booleana es verdadera:

Stream.of(b1, b2, b3, ...) 
     .filter(b -> b) 
     .count() == 1; 
Cuestiones relacionadas