Le code suivant sorties: p> Pourquoi XOR renvoie-t-il S'il s'agit de la logique valide Comment puis-je implémenter la logique qui retourne true code> lorsque les trois entrées sont
true code>? p>
true code> seulement strong> si l'un des éléments d'entrée est
vrai code> (peu importe le nombre d'entrées que je fournis)? p> p>
7 Réponses :
parce que vrai xor true = faux, et faux xor vrai est vrai. Xor est associatif, alors groupe les valeurs de toute façon que vous s'il vous plaît! p>
Pour décider que seul l'un d'entre eux est vrai, vous pouvez ajouter les valeurs ensemble comme des entiers et voir si la réponse est 1. P>
Je réponds à cela comme une question de programmation générale, ce n'est vraiment pas particulier à Java. P>
Je viens de réaliser org.apache.commons.lang.boolanceanutils # xor (boolean []) code> fait exactement ce dont j'ai besoin. Merci pour une idée quand même!
@parxier org.apache.commons.lang.bolitils.xor (nouveau boolean [] {boolean.true, boolean.true, boolean.true}) renvoie aussi vrai, ce qui n'est pas ce que vous voulez dans votre question
penser à la manière dont le compilateur évalue ceci: après le premier terme true ^ true code>, qui est
false code>, a été évalué : p>
'^' est un opérateur logique binaire, pas un opérateur N-ARY. P>
Si A, B, C est des entrées, pour la logique que vous recherchez, vous avez besoin de quelque chose comme celui-ci p> vrai ^ true ^ true code> peut être écrit (pour la compréhension) comme
(true ^ true) ^ true code> qui est
vrai code>.
D'accord. Est-ce l'expression la plus courte ... vraiment? :-)
C'est ce que j'ai pu penser. Je ne sais pas comment simplifier cela.
A? B? Faux :! C: B ?! C: C Peut-être? Ou un?! (B || c): b ^ c
If you want a true result, if one and only one inputs is true you can use: (a ^ b ^ c ) ^ ( a && b && c ) the test case result: true true true = false true true false = false true false true = false true false false = true false true true = false false true false = true false false true = true false false false = false
Pour ce que cela vaut, le côté droit n'a que besoin de tester toutes deux variables i>. Je l'ai également modifié pour utiliser &&! Code> pour rejoindre les deux côtés, car a) je trouve l'intention plus claire de cette façon, et b) si le côté gauche est faux, il n'y a pas besoin d'évaluer le côté droit :
(a ^ b ^ c) &&! (a && b) code> (j'ai fait un test rapide à neuf-neufs à ce sujet, et cela a fonctionné.)
(Et par "test à neuf voies", je veux dire "test à huit voies" :-))
Je ne sais pas est-ce découvert et mis en évidence, mais j'ai remarqué une chose que si nous ajoutons toutes les valeurs ensemble (peu importe combien y a-t-il) et que vous voyez ce qui reste après la division par 2, nous pouvons remarquer le résultat est Exemple: P>
Ils sont les mêmes.
S'il vous plaît, corrigez-moi ou guide qui a une idée de cette affaire. P> false code> si
0 code> gauche et
true code> si
1 code> gauche. P>
1 ^ 0 ^ 1 ^ 1 = 1 code>
et
(1 + 0 + 1 + 1)% 2 = 1 code> p>
Voici une façon de déterminer si exactement un booléen est vrai:
True ^ true ^ true code> peut être écrit (pour la compréhension) comme
(true ^ true) ^ true code> qui est
vrai code>.