Crear un operador "lógico exclusivo o" en Java

Resuelto eleven81 asked hace 15 años • 19 respuestas

Observaciones:

Java tiene un operador AND lógico.
Java tiene un operador lógico OR.
Java tiene un operador NOT lógico.

Problema:

Java no tiene un operador XOR lógico, según sun . Me gustaría definir uno.

Definición del método:

Como método se define simplemente de la siguiente manera:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}


Llamada al método:

Este método se llama de la siguiente manera:

boolean myVal = logicalXOR(x, y);


Uso del operador:

Preferiría tener un operador, usado de la siguiente manera:

boolean myVal = x ^^ y;


Pregunta:

No puedo encontrar nada sobre cómo definir un nuevo operador en Java. ¿Donde debería empezar?

eleven81 avatar Apr 07 '09 23:04 eleven81
Aceptado

Java tiene un operador XOR lógico , es ^ (como en a ^ b).

Aparte de eso, no puedes definir nuevos operadores en Java.

Editar: aquí hay un ejemplo:

public static void main(String[] args) {
    boolean[] all = { false, true };
    for (boolean a : all) {
        for (boolean b: all) {
            boolean c = a ^ b;
            System.out.println(a + " ^ " + b + " = " + c);
        }
    }
}

Producción:

falso ^ falso = falso
falso ^ verdadero = verdadero
verdadero ^ falso = verdadero
verdadero ^ verdadero = falso
javashlook avatar Apr 07 '2009 17:04 javashlook

¿No es x! = y?

Maurice Perry avatar Apr 07 '2009 17:04 Maurice Perry

Java tiene un operador AND lógico.
Java tiene un operador lógico OR.

Equivocado.

Java tiene

  • dos operadores AND lógicos: AND normal es & y cortocircuito AND es &&, y
  • dos operadores lógicos OR: OR normal es | y el cortocircuito OR es ||.

XOR sólo existe como ^, porque no es posible la evaluación de cortocircuito.

starblue avatar Apr 07 '2009 18:04 starblue

Quizás no entendiste la diferencia entre &y &&y El propósito de los operadores de acceso directo |y es que el valor del primer operando puede determinar el resultado y , por lo tanto, no es necesario evaluar el segundo operando.||&&||

Esto es especialmente útil si el segundo operando daría como resultado un error. p.ej

if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)

Sin embargo, con XOR , siempre hay que evaluar el segundo operando para obtener el resultado, de modo que la única operación significativa sea ^.

Peter Lawrey avatar Apr 07 '2009 20:04 Peter Lawrey

puedes simplemente escribir(a!=b)

Esto funcionaría de la misma manera que a ^ b.

Shuliyey avatar Jun 04 '2013 06:06 Shuliyey