Observations:
Java a un opérateur ET logique.
Java a un opérateur OU logique.
Java a un opérateur NOT logique.
Problème:
Selon Sun , Java n'a pas d'opérateur XOR logique . Je voudrais en définir un.
Définition de la méthode:
En tant que méthode, elle est simplement définie comme suit:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
Appel de méthode:
Cette méthode est appelée de la manière suivante:
boolean myVal = logicalXOR(x, y);
Utilisation de l'opérateur:
Je préférerais de loin un opérateur, utilisé comme suit:
boolean myVal = x ^^ y;
Question:
Je ne trouve rien sur la façon de définir un nouvel opérateur en Java. Par où dois-je commencer?
!=
, il y a aussi un XNOR logique appelé==
Réponses:
Java a un opérateur XOR logique , c'est ^ (comme dans
a ^ b
).En dehors de cela, vous ne pouvez pas définir de nouveaux opérateurs en Java.
Edit: Voici un exemple:
Production:
la source
N'est-ce pas x! = Y?
la source
a != b != c
cela ne fonctionnera pas, mais lea ^ b ^ c
fera? Dans ce cas, vous vous trompez .new Boolean(true) != new Boolean(true)
donnetrue
.Faux.
Java a
XOR existe uniquement en tant que ^, car l'évaluation des courts-circuits n'est pas possible.
la source
Vous avez peut-être mal compris la différence entre
&
et&&
,|
et||
Le but des opérateurs de raccourci&&
et||
est que la valeur du premier opérande peut déterminer le résultat et donc le deuxième opérande n'a pas besoin d'être évalué.Cela est particulièrement utile si le deuxième opérande entraîne une erreur. par exemple
Cependant, avec XOR , vous devez toujours évaluer le deuxième opérande pour obtenir le résultat, de sorte que la seule opération significative soit
^
.la source
Vous pouvez simplement écrire
(a!=b)
Cela fonctionnerait de la même manière que
a ^ b
.la source
C'est parce que la surcharge des opérateurs est quelque chose qu'ils ont spécifiquement laissé de côté délibérément. Ils ont "triché" un peu avec la concaténation de chaînes, mais au-delà, une telle fonctionnalité n'existe pas.
(Avertissement: je n'ai pas travaillé avec les 2 dernières versions majeures de Java, donc si c'est le cas maintenant, je serai très surpris)
la source
La seule surcharge d'opérateur en Java est + sur les chaînes ( JLS 15.18.1 Opérateur de concaténation des chaînes + ).
La communauté est divisée en 3 depuis des années, 1/3 n'en veut pas, 1/3 le veulent et 1/3 s'en fiche.
Vous pouvez utiliser unicode pour créer des noms de méthode qui sont des symboles ... donc si vous avez un symbole que vous souhaitez utiliser, vous pouvez faire myVal = x. $ (Y); où $ est le symbole et x n'est pas une primitive ... mais cela va être douteux dans certains éditeurs et limite car vous ne pouvez pas le faire sur une primitive.
la source
Le code suivant:
est superflu.
Pourquoi ne pas écrire:
?
De plus, comme l'a dit javashlook , il y a déjà un
^
opérateur.!=
et^
fonctionnent de manière identique * pour les opérandes booléens (votre cas), mais différemment pour les opérandes entiers.* Notes:
1. Ils fonctionnent de manière identique pour les opérandes
boolean
(type primitif), mais pasBoolean
(type objet). En tant queBoolean
(type d'objet), les valeurs peuvent avoir une valeurnull
. Et!=
retournerafalse
outrue
lorsque l'un ou les deux de ses opérandes le sontnull
, tandis que^
jetteraNullPointerException
dans ce cas.2. Bien qu'ils fonctionnent de manière identique, ils ont une priorité différente, par exemple lorsqu'ils sont utilisés avec
&
:a & b != c & d
seront traités commea & (b != c) & d
, tandis quea & b ^ c & d
seront traités comme(a & b) ^ (c & d)
(hors sujet: aïe, le tableau de priorité de style C est nul).la source
!=
Boolean
valeurs ne!=
fonctionne pas correctement. Pour lesboolean
valeurs c'est ok.Voici une méthode var arg XOR pour java ...
Prendre plaisir
la source
XOR(true,true,true)
renvoie true, ce qui ne ressemble pas à ce que vous attendez d'une méthode appeléeXOR
. Mon comportement attendu serait qu'il retourne toujours faux (ce qui n'est bien sûr pas utile)Logique exclusif ou en Java est appelé
!=
. Vous pouvez également l'utiliser^
si vous souhaitez confondre vos amis.la source
Vous pouvez utiliser Xtend (Infix Operators et Operator Overloading) pour surcharger les opérateurs et «rester» sur Java
la source
^
; vous devez utiliserbool_1.xor(bool_2)
. Curieusement, l'analyseur ne vous permet même pas d' utiliser le curseur; vous devez utiliserxor
pour les booléens etbitwiseXor
pour les entiers. Vous pourriez, bien sûr, surcharger un autre opérateur, mais cela deviendrait très déroutant.Ce que vous demandez n'aurait pas beaucoup de sens. À moins que je ne me trompe, vous suggérez que vous souhaitez utiliser XOR pour effectuer les opérations logiques de la même manière ET et OU. Votre code fourni montre en fait ce à quoi je me réfère:
Votre fonction a des entrées booléennes et lorsque XOR au niveau du bit est utilisé sur les booléens, le résultat est le même que le code que vous avez fourni. En d'autres termes, XOR au niveau du bit est déjà efficace lors de la comparaison de bits individuels (booléens) ou de la comparaison des bits individuels dans des valeurs plus grandes. Pour mettre cela en contexte, en termes de valeurs binaires, toute valeur non nulle est TRUE et seul ZERO est faux.
Donc, pour que XOR soit appliqué de la même manière que Logical AND est appliqué, vous n'utiliseriez que des valeurs binaires avec un seul bit (donnant le même résultat et la même efficacité) ou la valeur binaire devrait être évaluée dans son ensemble au lieu de par bit. En d'autres termes, l'expression (010 ^^ 110) = FALSE au lieu de (010 ^^ 110) = 100. Cela supprimerait la plupart du sens sémantique de l'opération et représente un test logique que vous ne devriez pas utiliser de toute façon.
la source
A et B doivent être des valeurs booléennes pour que! = Soit le même que xor afin que la table de vérité soit identique. Vous pouvez également utiliser! (A == B) lol.
la source
J'utilise la classe très populaire "org.apache.commons.lang.BooleanUtils"
Cette méthode est testée par de nombreux utilisateurs et sûre. S'amuser. Usage:
la source
Comme le type de données booléen est stocké comme un entier, l'opérateur de bit ^ fonctionne comme une opération XOR s'il est utilisé avec des valeurs booléennes.
la source
Voici un exemple:
Étant donné 2 valeurs int, renvoyez true si l'une est négative et l'autre positive. Sauf si le paramètre "négatif" est vrai, ne retournez vrai que si les deux sont négatifs.
la source
vous devrez passer à Scala pour implémenter vos propres opérateurs
exemple de tuyau
la source