Observações:
Java possui um operador AND lógico.
Java possui um operador OR lógico.
Java possui um operador NOT lógico.
Problema:
Java não possui um operador XOR lógico, de acordo com a sun . Eu gostaria de definir um.
Definição do método:
Como método, é simplesmente definido da seguinte forma:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
Chamada de método:
Este método é chamado da seguinte maneira:
boolean myVal = logicalXOR(x, y);
Uso do Operador:
Eu preferiria ter um operador, usado da seguinte maneira:
boolean myVal = x ^^ y;
Questão:
Não consigo encontrar nada sobre como definir um novo operador em Java. Por onde devo começar?
!=
, há também uma XNOR lógica chamada==
Respostas:
Java tem um operador XOR lógico , é ^ (como em
a ^ b
).Além disso, você não pode definir novos operadores em Java.
Edit: Aqui está um exemplo:
Resultado:
fonte
Não é x! = Y?
fonte
a != b != c
que não vai funcionar, masa ^ b ^ c
vai? Nesse caso, você está errado .new Boolean(true) != new Boolean(true)
dátrue
.Errado.
Java tem
O XOR existe apenas como ^, porque a avaliação de curto-circuito não é possível.
fonte
Talvez você tenha entendido mal a diferença entre
&
and&&
,|
e||
O objetivo dos operadores de atalho&&
e||
é que o valor do primeiro operando possa determinar o resultado e, portanto, o segundo operando não precise ser avaliado.Isso é especialmente útil se o segundo operando resultar em um erro. por exemplo
No entanto, com o XOR , você sempre deve avaliar o segundo operando para obter o resultado, portanto a única operação significativa é
^
.fonte
Você pode escrever
(a!=b)
Isso funcionaria da mesma maneira que
a ^ b
.fonte
Isso ocorre porque a sobrecarga do operador é algo que eles especificamente deixaram deliberadamente fora do idioma. Eles "trapacearam" um pouco com a concatenação de strings, mas além disso, essa funcionalidade não existe.
(aviso de isenção de responsabilidade: não trabalhei com os últimos dois grandes lançamentos de java, por isso, se estiver disponível agora, ficarei muito surpreso)
fonte
O único operador que sobrecarrega em Java é + em Strings ( JLS 15.18.1 String Concatenation Operator + ).
A comunidade foi dividida em três por anos, 1/3 não o quer, 1/3 o quer e 1/3 não se importa.
Você pode usar o unicode para criar nomes de métodos que são símbolos ... portanto, se você tiver um símbolo que deseja usar, poderá fazer myVal = x. $ (Y); onde $ é o símbolo ex não é um primitivo ... mas isso vai ser desonesto em alguns editores e é limitado, pois você não pode fazer isso em um primitivo.
fonte
A seguir, seu código:
é supérfluo.
Por que não escrever:
?
Além disso, como javashlook disse , já existe
^
operador.!=
e^
trabalhe de forma idêntica * para operandos booleanos (seu caso), mas de maneira diferente para operandos inteiros.* Notas:
1. Eles funcionam de forma idêntica para operandos
boolean
(tipo primitivo), mas nãoBoolean
(tipo de objeto). OsBoolean
valores (tipo de objeto) podem ter valornull
. E!=
retornaráfalse
outrue
quando um ou ambos os seus operandos estiveremnull
, enquanto^
lançaráNullPointerException
neste caso.2. Embora funcionem de forma idêntica, eles têm precedência diferente, por exemplo, quando usados com
&
:a & b != c & d
serão tratados comoa & (b != c) & d
, enquantoa & b ^ c & d
serão tratados como(a & b) ^ (c & d)
(offtopic: ai, tabela de precedência no estilo C é uma porcaria).fonte
!=
Boolean
values!=
funciona incorretamente. Paraboolean
valores está tudo bem.Aqui está um método XOR var arg para java ...
Aproveitar
fonte
XOR(true,true,true)
retorna true, o que parece não ser o que você esperaria de um método chamadoXOR
. Meu comportamento esperado seria que ele sempre retorna falso (que é, naturalmente, não é útil)Exclusivo lógico - ou em Java é chamado
!=
. Você também pode usar^
se quiser confundir seus amigos.fonte
Você pode usar o Xtend (operadores infix e sobrecarga de operadores) para sobrecarregar os operadores e 'permanecer' em Java
fonte
^
; você deve usarbool_1.xor(bool_2)
. Estranhamente, o analisador nem permite que você use o cursor; você deve usarxor
para booleanos ebitwiseXor
para números inteiros. É claro que você poderia sobrecarregar outro operador, mas isso seria muito confuso.O que você está pedindo não faria muito sentido. A menos que eu esteja incorreto, você está sugerindo que deseja usar o XOR para executar operações lógicas da mesma forma que AND e OR. Seu código fornecido realmente mostra o que estou me referindo:
Sua função possui entradas booleanas e, quando o XOR bit a bit é usado em booleanos, o resultado é o mesmo que o código que você forneceu. Em outras palavras, o XOR bit a bit já é eficiente na comparação de bits individuais (booleanos) ou na comparação de bits individuais em valores maiores. Para colocar isso em contexto, em termos de valores binários, qualquer valor diferente de zero é TRUE e apenas ZERO é falso.
Portanto, para que o XOR seja aplicado da mesma forma que Logical AND é aplicado, você usaria apenas valores binários com apenas um bit (fornecendo o mesmo resultado e eficiência) ou o valor binário teria que ser avaliado como um todo, em vez de por bit. Em outras palavras, a expressão (010 ^^ 110) = FALSE em vez de (010 ^^ 110) = 100. Isso removeria a maior parte do significado semântico da operação e representa um teste lógico que você não deve usar de qualquer maneira.
fonte
A e B teriam que ser valores booleanos para fazer! = O mesmo que xor, para que a tabela verdade tivesse a mesma aparência. Você também pode usar! (A == B) lol.
fonte
Estou usando a classe muito popular "org.apache.commons.lang.BooleanUtils"
Este método é testado por muitos usuários e seguro. Diverta-se. Uso:
fonte
Como o tipo de dados booleano é armazenado como um número inteiro, o operador de bit ^ funciona como uma operação XOR se usado com valores booleanos.
fonte
Aqui está um exemplo:
Dados 2 valores int, retorne true se um for negativo e outro for positivo. Exceto se o parâmetro "negativo" for verdadeiro, retorne verdadeiro somente se ambos forem negativos.
fonte
você precisará mudar para o Scala para implementar seus próprios operadores
exemplo de tubo
fonte