La création d'une “logique ou exclusif” opérateur en Java
Observations:
Java a une logique ET de l'opérateur.
Java est un opérateur logique OU.
Java est un opérateur logique not.
Problème:
Java n'a pas de logique opérateur XOR, selon sun. Je tiens à en définir un.
Définition De La Méthode:
Comme une méthode, il est simplement défini comme suit:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
Appel De La Méthode:
Cette méthode est appelée de la manière suivante:
boolean myVal = logicalXOR(x, y);
Opérateur D'Utilisation:
Je préférerais de beaucoup avoir un opérateur, utilisés comme suit:
boolean myVal = x ^^ y;
Question:
Je ne trouve rien sur la façon d'aller sur la définition d'un nouvel opérateur en Java. Où dois-je commencer?
- quoi? le lien que tu as donné a le contenu "bit à bit OU exclusif'
- avez-vous été vous demandez-vous alors si vous pouviez définir les opérateurs en Java comme vous pouvez le faire en C++?
- Il semble que vous avez mal compris la différence entre & et &&. Les deux sont des opérateurs logiques (un booléen). Starblue réponse le couvre de plus en plus largement.
- juste parce qu'il n'est pas dans le tutoriel, ne signifie pas que Java n'a pas elle - tutoriels ne sont pas (toujours) complet. Voir Java Language Specification 15.22.2
- Il est appelé
!=
, il y a aussi une logique XNOR appelé==
Vous devez vous connecter pour publier un commentaire.
Java a une logique opérateur XOR, il 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:
De sortie:
&&
est le plus "normal" pour la plupart des gensa != b
N'est-il pas x != y ?
a != b != c
ne fonctionne pas, maisa ^ b ^ c
va? Dans ce cas, vous vous trompez.a ^ b ^ ... ^ z
? Si vous voulez un résultat vrai uniquement quand un des variables est vrai, vous serez très déçu. À la fois une chaîne de^
et de!=
retourne true si le nombre de vrais variables est impair. Quelque chose à garder à l'esprit.!=
pour XOR, vous obtenez==
pour XNOR. Malheureusement, il n'y a pas builtin symboles pour les NAND et NOR.!&
et!|
aurait été cool.new Boolean(true) != new Boolean(true)
donnetrue
.^
tarif? Je suppose qu'il implose ainsi....Mal.
Java a
XOR n'existe qu' ^, parce évaluation de court-circuit n'est pas possible.
Peut-être que vous avez mal compris la différence entre
&
et&&
,|
et||
Le but du raccourci opérateurs
&&
et||
est que la valeur de la première opérande peut déterminer le résultat et donc le deuxième opérande n'a pas besoin d'être évalué.Ceci est particulièrement utile si le deuxième opérande serait une erreur.
par exemple,
Cependant avec XOR, vous devez toujours évaluer le second opérande pour obtenir le résultat le sens de l'opération est
^
.Vous pouvez simplement écrire
(a!=b)
Cela fonctionne de la même façon que
a ^ b
.C'est parce que la surcharge d'opérateur est quelque chose qu'ils spécifiquement à gauche de la langue délibérément. Ils ont "triché" un peu avec la concaténation de chaîne, mais au-delà, une telle fonctionnalité n'existe pas.
(disclaimer: je n'ai pas travaillé avec les 2 dernières versions majeures de java, donc si c'est maintenant, je vais être très surpris)
La seule surcharge d'opérateur en Java est de + sur les Chaînes (JLS 15.18.1 Opérateur de Concaténation de Chaîne +).
La communauté a été divisée par 3 depuis des années, 1/3 n'en veut pas, 1/3 voulez, et 1/3 n'a pas de soins.
Vous pouvez utiliser l'unicode pour créer des noms de méthode qui sont des symboles... donc si vous avez un symbole que vous souhaitez utiliser, vous pourriez faire myVal = x.$(y); où $ est le symbole et x n'est pas une primitive... mais qui va être douteux de certains éditeurs et limite puisque vous ne pouvez pas le faire sur une primitive.
La suite de votre code:
est superflu.
Pourquoi ne pas écrire:
?
Aussi, comme javashlook dit, il y a déjà
^
opérateur.!=
et^
fonctionnent de la même manière* pour les opérandes booléens (votre cas), mais de manière différente pour des opérandes entiers.* Notes:
1. Ils fonctionnent de la même manière pour
boolean
(type primitif), mais pasBoolean
(type d'objet) opérandes. CommeBoolean
(type d'objet) les valeurs valeur denull
. Et!=
sera de retourfalse
outrue
quand un ou deux de ses opérandes sontnull
, tandis que^
va jeterNullPointerException
dans ce cas.2. Bien qu'ils fonctionnent de la même manière, ils ont différents priorité, par exemple, lorsqu'il est utilisé avec
&
:a & b != c & d
seront traités comme desa & (b != c) & d
, tandis quea & b ^ c & d
seront traités comme des(a & b) ^ (c & d)
(hors-sujet: aïe, C-priorité de style de tableau suce).!=
Boolean
valeurs!=
fonctionne pas correctement. Pourboolean
valeurs c'est ok.Ici est une var arg XOR méthode pour java...
Profiter de
XOR(true,true,true)
renvoie la valeur true, ce qui ne semble pas comme ce que vous attendez d'une méthode appeléeXOR
. Mon comportement attendu serait qu'elle renvoie toujours false (ce qui n'est évidemment pas utile)Vous pouvez utiliser Xtend (Opérateurs Infixes et la Surcharge d'Opérateur) à la surcharge d'opérateurs et de "rester" sur Java
^
; vous devez utiliserbool_1.xor(bool_2)
. Curieusement, l'analyseur ne vous permettent même de utilisation le signe; vous devez utiliserxor
pour les booléens etbitwiseXor
pour les entiers. Vous pouvez, bien sûr, la surcharge d'un autre opérateur, mais cela pourrait devenir très déroutant.Ce que vous me demandez ne serait pas beaucoup de sens. Sauf si je suis incorrect, vous êtes ce qui suggère que vous souhaitez utiliser XOR pour effectuer des opérations Logiques de la même manière ET et OU de faire. Votre code fourni montre réellement ce que je suis en faisant référence à:
Votre fonction booléenne entrées, et quand XOR au niveau du bit est utilisé sur les booléens le résultat est le même que le code que vous avez fournis. En d'autres termes, XOR au niveau du bit est déjà efficace lorsque l'on compare les bits individuels(booléens) ou comparer les bits individuels dans de plus grandes valeurs. Pour mettre cela en contexte, en termes de valeurs binaires toute valeur non nulle est VRAIE et seulement le ZÉRO est faux.
Donc pour XOR être appliquée de la même façon Logique ET est appliquée, vous devrez soit utiliser uniquement des valeurs binaires avec juste un peu(ce qui donne le même résultat et de l'efficacité) ou la valeur binaire devra ê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. Ce serait d'enlever la plupart de la sémantique de l'opération, et représente un test logique, vous ne devriez pas l'utiliser de toute façon.
Logique ou-exclusif en Java est appelé
!=
. Vous pouvez également utiliser^
si vous souhaitez prendre vos amis.A et B doivent être des valeurs booléennes à faire != le même que le xor de sorte que la table de vérité serait le même aspect. Vous pouvez également utiliser !(A==B) lol.
Je suis l'aide de la très populaire de la classe "org.apache.commons.lang.BooleanUtils"
Cette méthode est testée par de nombreux utilisateurs et coffre-fort. Avoir du plaisir.
Utilisation:
Parce que type de données booléen est stocké comme un entier, bits opérateur ^ fonctionne comme une opération XOR avec des valeurs booléennes.
Voici un exemple:
2 int valeurs, retourne true si l'un est négatif et un positif. Sauf si le paramètre "négatif" est vrai, alors retourner vrai que si les deux sont négatifs.
vous aurez besoin de passer à la Scala de mettre en œuvre votre propre des opérateurs
pipe exemple