¿Es una buena práctica usar el operador xor para verificaciones booleanas? [closed]

4 minutos de lectura

avatar de usuario
Pedro

personalmente me gusta el exclusivo o, ^, operador cuando tiene sentido en el contexto de comprobaciones booleanas debido a su concisión. prefiero escribir

if (boolean1 ^ boolean2)
{
  //do it
}

que

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

pero a menudo recibo miradas confusas de otros desarrolladores de Java experimentados (no solo los novatos) y, a veces, comentarios sobre cómo solo debe usarse para operaciones bit a bit.

Tengo curiosidad en cuanto a las mejores prácticas con respecto al uso de la ^ operador.

Simplemente puede usar != en cambio.

  • “¿Qué tiene de malo!” bool1 ^ bool2 ^ bool3 tiene más sentido lógico para mí que bool1 != bool2 != bool3

    – Blue Raja – Danny Pflughoeft

    5 mayo 2010 a las 20:54

  • Me duele el cerebro. Entonces, ¿puede != dar resultados incorrectos o no?

    – obsoleto

    14/10/2011 a las 17:06

  • @vemv, != da resultados correctos para booleans (pero no para Booleanasí que ten cuidado). Sin embargo, no siempre es bonito, por ejemplo. (some != null) != (other != null) no es muy legible. Tienes que extraer las partes en booleanos explícitos o extraer el != en un método separado.

    – ivan

    22 de diciembre de 2011 a las 12:52

  • Este es el por qué: a ^ b => “a o b pero no ambos”, a != b => “a no es igual a b”. (Lo que dijo @RobertGrant). La mayoría de los humanos entenderían el primero más fácilmente si supieran qué es xor (lo cual es bastante útil saber si estás en el campo de la informática…)

    – Harold R. Eason

    22 de noviembre de 2013 a las 20:53

  • @ HaroldR.Eason importante quisquilloso aquí: a != b => “a no es IDÉNTICO a b”

    – Mario Reutter

    4 de agosto de 2016 a las 16:17

Creo que ha respondido a su propia pregunta: si recibe miradas extrañas de las personas, probablemente sea más seguro optar por la opción más explícita.

Si necesita comentarlo, probablemente sea mejor que lo reemplace con la versión más detallada y no haga que la gente haga la pregunta en primer lugar.

  • Puedo asegurarte, obtendrás miradas extrañas de mí, cuando escribas seriamente (boolean1 && !boolean2) || (boolean2 && !boolean1) en un código de aplicación de la vida real…

    – Holger

    5 mayo 2017 a las 14:59

avatar de usuario
david tarkowski

Encuentro que tengo muchas conversaciones similares. Por un lado, tiene un método compacto y eficiente para lograr su objetivo. Por otro lado, tienes algo que el resto de tu equipo podría no entender, lo que dificulta su mantenimiento en el futuro.

Mi regla general es preguntar si la técnica que se utiliza es algo que es razonable esperar que los programadores en general sepan. En este caso, creo que es razonable esperar que los programadores sepan cómo usar operadores booleanos, por lo que usar xor en una declaración if está bien.

Como ejemplo de algo que no estaría bien, tome el truco de usar xor para intercambiar dos variables sin usar una variable temporal. Ese es un truco con el que no espero que todos estén familiarizados, por lo que no pasaría la revisión del código.

avatar de usuario
Dre

Creo que estaría bien si lo comentaras, por ejemplo. // ^ == XOR.

avatar de usuario
cory bruto

Siempre puede envolverlo en una función para darle un nombre detallado:

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}

Pero me parece que no sería difícil para cualquiera que no supiera para qué sirve el operador ^ buscarlo en Google muy rápido. No va a ser difícil de recordar después de la primera vez. Como solicitó otros usos, es común usar el XOR para enmascarar bits.

Tú también puedes use XOR para intercambiar los valores en dos variables sin usar una tercera variable temporal.

// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;

Aquí hay una pregunta de Stackoverflow relacionada con el intercambio de XOR.

avatar de usuario
Y–

if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

En mi humilde opinión, este código podría simplificarse:

if(boolean1 != boolean2) 
{ 
  //do it 
} 

avatar de usuario
hermano

Con la claridad del código en mente, mi opinión es que usar XOR en comprobaciones booleanas no es un uso típico para el operador bit a bit XOR. Desde mi experiencia, bit a bit XOR en Java es típicamente utilizado para implementar una máscara flag toggle comportamiento:

flags = flags ^ MASK;

Este El artículo de Vipan Singla explica el caso de uso con más detalle.

Si necesita usar XOR bit a bit como en su ejemplo, comente por qué lo usa, ya que es probable que requiera que incluso una audiencia alfabetizada bit a bit se detenga en seco para comprender por qué lo está usando.

¿Ha sido útil esta solución?