12
votes

Dans Java Xor avec trois véritables entrées, le retour est vrai. Pourquoi?

Le code suivant xxx

sorties: xxx

Pourquoi XOR renvoie-t-il true lorsque les trois entrées sont true ?

S'il s'agit de la logique valide Comment puis-je implémenter la logique qui retourne true seulement si l'un des éléments d'entrée est vrai (peu importe le nombre d'entrées que je fournis)?


1 commentaires

True ^ true ^ true peut être écrit (pour la compréhension) comme (true ^ true) ^ true qui est vrai .


7 Réponses :


11
votes

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!

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.

Je réponds à cela comme une question de programmation générale, ce n'est vraiment pas particulier à Java.


2 commentaires

Je viens de réaliser org.apache.commons.lang.boolanceanutils # xor (boolean []) 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



7
votes

penser à la manière dont le compilateur évalue ceci: xxx

après le premier terme true ^ true , qui est false , a été évalué : xxx


0 commentaires

2
votes

'^' est un opérateur logique binaire, pas un opérateur N-ARY.


0 commentaires

3
votes

vrai ^ true ^ true peut être écrit (pour la compréhension) comme (true ^ true) ^ true qui est vrai .

Si A, B, C est des entrées, pour la logique que vous recherchez, vous avez besoin de quelque chose comme celui-ci xxx


3 commentaires

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



19
votes
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

2 commentaires

Pour ce que cela vaut, le côté droit n'a que besoin de tester toutes deux variables . Je l'ai également modifié pour utiliser &&! 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) (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" :-))



0
votes

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 false si 0 gauche et true si 1 gauche.

Exemple:

1 ^ 0 ^ 1 ^ 1 = 1 et (1 + 0 + 1 + 1)% 2 = 1

Ils sont les mêmes. S'il vous plaît, corrigez-moi ou guide qui a une idée de cette affaire.


0 commentaires

8
votes

Voici une façon de déterminer si exactement un booléen est vrai: xxx


0 commentaires