2010-11-14 7 views
21

Mi pregunta utiliza Java como ejemplo, pero supongo que se aplica probablemente a todos.¿Cuál es la diferencia entre XOR y NOT-EQUAL-TO?

¿Hay alguna diferencia práctica entre el operador XOR (^ en Java) y el NO-EQUAL-A (! = En Java), al comparar valores booleanos?

que evaluaron las cosas aquí, pero yo sólo preguntaba (parece raro, dos cosas son iguales) ... y no encontraron nada en la red. Solo una discusión en algún foro que terminó rápidamente sin ningún resultado.

+0

Algunas discusiones relacionadas en esta pregunta (yo personalmente no lo consideraría un duplicado, por ejemplo): http://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the- xor-operator-in-java-for-boolean-checks – eldarerathis

+0

Una nota tangencial: Como han dicho las respuestas a continuación, los dos operadores significan lo mismo para los booleanos. Esto no es cierto en el caso general, al menos en C++. Como los operadores pueden estar sobrecargados en C++, los operadores '! =' Y '^' pueden o no hacer lo mismo. Además, usar '! =' En oposición a '^' deja bastante claro que se está realizando una prueba de desigualdad. –

+0

Lo siento, ni siquiera vi esa pregunta, tal vez porque los títulos son diferentes y el verificador de preguntas no lo entendió. De todos modos, las respuestas aquí fueron mucho mejores e iluminadas, en mi humilde opinión. Acerca de lo que se dice allí ... Tiendo a estar de acuerdo: si está a punto de guardar una de las pocas letras que deja el código más oscuro, prefiero que se vuelva detallado. Me quedaré con! = En estas situaciones. – davidcesarino

Respuesta

26

Para valores booleanos, que significan la misma cosa - aunque hay un operador de asignación compuesto para XOR:

x ^= y; 

No hay asignación de compuesto equivalente operador de desigualdad.

En cuanto a por qué ambos están disponibles, sería extraño que XOR no esté disponible simplemente porque funciona de la misma manera que la desigualdad. Debería lógicamente estar allí, así es. Para los tipos no booleanos el resultado es diferente porque es un tipo de resultado diferente, pero eso no significa que tenga sentido eliminar XOR para boolean.

+0

Sí, esos fueron mis pensamientos exactamente! Solo quería asegurarme porque, en términos generales, no veo muchas cosas que sean esencialmente las mismas que sirven un mismo propósito (una especie de navaja de afeitar de Occam, supongo ...). Esta preocupación obviamente no se aplica al ternario, que es, por supuesto, una mejor manera y una forma más limpia de hacer lo mismo. Pero con mi caso aquí es realmente lo mismo. Pero sí, tenías razón sobre el tema y mi pregunta. Gracias. – davidcesarino

0

Deberían ser esencialmente iguales en este caso.

0

Hay una gran diferencia, XOR trabaja a nivel de bits, manteniendo las diferencias como queridos, por lo 0b0011 xor 0b1101 => 0b1110

cordiales, // t

+4

ah, comparando booleanos ... No, no hay diferencia ... – Teson

3

Sí, puede utilizar XOR para probar booleanos para (in) igualdad, aunque el código es menos intuitivo: if (x^y) versus if (x != y).

3

Con valores booleanos, no debería haber diferencia. Debe elegir el que sea más apropiado para su sentido de operación.

Ejemplo:

bool oldChoice = ...; 
bool newChoice = ...; 
if (oldChoice != newChoice) 
    ... 

Aquí XOR daría el mismo resultado, pero no reflejará la intención real de código.

19

Como se indica en la Java Language Specification:

El resultado de = es falso si los operandos son true o ambos falsa; de lo contrario, el resultado es verdadero. Así! = Se comporta igual que^(§15.22.2) cuando se aplica a operandos booleanos.

Además si se intenta mirar el código de bytes de un simple fragmento:

void test(boolean b1, boolean b2) { 
    boolean res1 = b1^b2; 
    boolean res2 = b1!=b2; 
} 

se obtiene:

test(ZZ)V 
    L0 
    LINENUMBER 45 L0 
    ILOAD 1 
    ILOAD 2 
    IXOR 
    ISTORE 3 
    L1 
    LINENUMBER 46 L1 
    ILOAD 1 
    ILOAD 2 
    IXOR 
    ISTORE 4 
    L2 
    LINENUMBER 47 L2 
    RETURN 
    L3 

Esto asegura que, además de la misma semántica, no hay ningún diferencia práctica real en la implementación. (También se puede ver que internamente enteros se utilizan para almacenar valores booleanos)

+0

¡Muchas gracias por la explicación tan profunda de cómo funciona! – davidcesarino

Cuestiones relacionadas