Observaciones:
Java tiene un operador lógico AND.
Java tiene un operador lógico OR.
Java tiene un operador lógico NOT.
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, simplemente se define de la siguiente manera:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
Llamada de método:
Este método se llama de la siguiente manera:
boolean myVal = logicalXOR(x, y);
Uso del operador:
Preferiría tener un operador, que se utiliza 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?
!=
, también hay un XNOR lógico llamado==
Respuestas:
Java tiene un operador XOR lógico , es ^ (como en
a ^ b
).Aparte de eso, no puede definir nuevos operadores en Java.
Editar: Aquí hay un ejemplo:
Salida:
fuente
¿No es x! = Y?
fuente
a != b != c
que no funcionará, pero loa ^ b ^ c
hará? En ese caso, estás equivocado .new Boolean(true) != new Boolean(true)
datrue
.Incorrecto.
Java tiene
XOR existe solo como ^, porque la evaluación de cortocircuito no es posible.
fuente
Quizás haya entendido mal 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 resultaría en un error. p.ej
Sin embargo, con XOR , siempre debe evaluar el segundo operando para obtener el resultado, por lo que la única operación significativa es
^
.fuente
Solo puedes escribir
(a!=b)
Esto funcionaría de la misma manera que
a ^ b
.fuente
Esto se debe a que la sobrecarga del operador es algo que específicamente dejaron fuera del lenguaje deliberadamente. "Hicieron trampa" un poco con la concatenación de cadenas, pero más allá de eso, dicha funcionalidad no existe.
(descargo de responsabilidad: no he trabajado con los últimos 2 lanzamientos principales de java, así que si está ahora, me sorprenderé mucho)
fuente
La única sobrecarga de operadores en Java es + en cadenas ( JLS 15.18.1 Operador de concatenación de cadenas + ).
La comunidad se ha dividido en 3 durante años, 1/3 no lo quiere, 1/3 lo quiere y a 1/3 no le importa.
Puede usar unicode para crear nombres de métodos que sean símbolos ... así que si tiene un símbolo que desea usar, puede hacer myVal = x. $ (Y); donde $ es el símbolo yx no es una primitiva ... pero eso será dudoso en algunos editores y es limitante ya que no puede hacerlo en una primitiva.
fuente
El siguiente su código:
Es superfluo.
Por qué no escribir:
?
Además, como dijo javashlook , ya hay un
^
operador.!=
y^
funciona de forma idéntica * para operandos booleanos (su caso), pero de manera diferente para operandos enteros.* Notas:
1. Funcionan de manera idéntica para operandos
boolean
(tipo primitivo), pero noBoolean
(tipo de objeto). ComoBoolean
(tipo de objeto) los valores pueden tener valornull
. Y!=
regresaráfalse
otrue
cuando uno o ambos de sus operandos lo esténnull
, mientras^
queNullPointerException
en este caso se lanzará .2. Aunque funcionan de manera idéntica, tienen una precedencia diferente, por ejemplo, cuando se usan con
&
:a & b != c & d
se tratarán comoa & (b != c) & d
, mientrasa & b ^ c & d
que se tratarán como(a & b) ^ (c & d)
(fuera del tema: ouch, la tabla de precedencia de estilo C apesta).fuente
!=
Boolean
valores!=
funciona incorrectamente. Para losboolean
valores está bien.Aquí hay un método var arg XOR para java ...
Disfrutar
fuente
XOR(true,true,true)
devuelve verdadero, que no parece lo que esperarías de un método llamadoXOR
. Mi comportamiento esperado sería que siempre devuelve falso (lo que, por supuesto, no es útil)Se llama lógico exclusivo-o en Java
!=
. También puedes usarlo^
si quieres confundir a tus amigos.fuente
Puede usar Xtend (operadores de infix y sobrecarga de operadores) para sobrecargar a los operadores y 'quedarse' en Java
fuente
^
; debes usarbool_1.xor(bool_2)
. Curiosamente, el analizador ni siquiera te permite usar el cursor; debes usarxor
para booleanos ybitwiseXor
para enteros. Podría, por supuesto, sobrecargar a otro operador, pero eso sería muy confuso.Lo que estás pidiendo no tendría mucho sentido. A menos que sea incorrecto, está sugiriendo que desea usar XOR para realizar operaciones lógicas de la misma manera AND y OR. Su código provisto en realidad muestra a lo que me refiero:
Su función tiene entradas booleanas, y cuando se utiliza XOR bit a bit en booleanos, el resultado es el mismo que el código que ha proporcionado. En otras palabras, XOR bit a bit ya es eficiente al comparar bits individuales (booleanos) o al comparar los bits individuales en valores más grandes. Para poner esto en contexto, en términos de valores binarios, cualquier valor distinto de cero es VERDADERO y solo CERO es falso.
Entonces, para que XOR se aplique de la misma manera que se aplica AND lógico, solo usaría valores binarios con solo un bit (dando el mismo resultado y eficiencia) o el valor binario tendría que evaluarse como un todo en lugar de por bit. En otras palabras, la expresión (010 ^^ 110) = FALSO en lugar de (010 ^^ 110) = 100. Esto eliminaría la mayor parte del significado semántico de la operación, y representa una prueba lógica que no debería usar de todos modos.
fuente
¡A y B tendrían que ser valores booleanos para hacer! = Lo mismo que xor para que la tabla de verdad se vea igual. También puedes usar! (A == B) lol.
fuente
Estoy usando la clase muy popular "org.apache.commons.lang.BooleanUtils"
Este método es probado por muchos usuarios y es seguro. Que te diviertas. Uso:
fuente
Dado que el tipo de datos booleanos se almacena como un entero, el operador de bit ^ funciona como una operación XOR si se usa con valores booleanos.
fuente
Aquí hay un ejemplo:
Dados 2 valores int, devuelve verdadero si uno es negativo y el otro es positivo. Excepto si el parámetro "negativo" es verdadero, entonces devuelve verdadero solo si ambos son negativos.
fuente
deberá cambiar a Scala para implementar sus propios operadores
ejemplo de tubería
fuente