2010-11-14 46 views
21

Ma question utilise Java comme exemple, mais je suppose que cela s'applique à probablement tous.Quelle est la différence entre XOR et NOT-EQUAL-TO?

Y at-il une différence pratique entre l'opérateur XOR (^ in java) et le NOT-EQUAL-TO (! = In java), lors de la comparaison de booléens?

J'ai évalué les choses ici, mais j'ai continué à me demander (semble bizarre, deux choses égales) ... et n'a rien trouvé sur le net. Juste une discussion dans un forum qui s'est terminée rapidement sans aucun résultat.

+0

Certaines discussions connexes dans cette question (personnellement, je ne le considérerais pas comme un doublon, par exemple): http://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the- xor-operator-in-java-for-boolean-checks – eldarerathis

+0

Une note tangentielle: Comme l'indiquent les réponses ci-dessous, les deux opérateurs signifient la même chose pour les booléens. Ce n'est pas vrai dans le cas général, au moins en C++. Comme les opérateurs peuvent être surchargés en C++, les opérateurs '! =' Et '^' peuvent ou non faire la même chose. En outre, l'utilisation de '! =' Par opposition à '^' montre clairement qu'un test d'inégalité est en cours. –

+0

Je suis désolé, je n'ai même pas vu cette question, peut-être parce que les titres sont différents et le vérificateur de question ne l'a pas compris. Quoi qu'il en soit, les réponses ici étaient beaucoup mieux et éclairées, à mon humble avis. A propos de ce qui est dit là ... J'ai tendance à être d'accord: si vous êtes sur le point de sauvegarder une des quelques lettres qui laisse le code plus obscur, je préfère être bavard. Je vais rester avec! = Dans ces situations. – davidcesarino

Répondre

26

Pour les valeurs booléennes, ils veulent dire la même chose - bien qu'il y ait un opérateur d'affectation de composé pour XOR:

x ^= y; 

Il n'y a pas affectation de composé équivalent opérateur pour l'inégalité. Pour ce qui est de savoir pourquoi ils sont tous deux disponibles - il serait étrange que XOR pas soit disponible juste parce que cela fonctionne de la même manière que l'inégalité. Il devrait logiquement être là, c'est ainsi. Pour les types non booléens, le résultat est différent car il s'agit d'un type de résultat différent, mais cela ne signifie pas qu'il serait logique de supprimer XOR pour boolean.

+0

Oui, ce sont mes pensées exactement! Je voulais juste m'assurer, parce qu'en général, je ne vois pas beaucoup de choses qui sont essentiellement les mêmes et qui servent un même but (un rasoir d'Occam, je suppose ...). Cette préoccupation ne s'applique évidemment pas au ternaire, qui est, bien sûr, une meilleure façon de faire la même chose. Mais avec mon cas ici, c'est vraiment pareil. Mais oui, vous aviez raison sur le point de la question et ma question. Je vous remercie. – davidcesarino

0

Ils devraient être essentiellement les mêmes dans ce cas.

0

Il y a une grande différence, XOR fonctionne au niveau de bits, en gardant les différences comme celles, si 0b0011 XOR 0b1101 => 0b1110

Cordialement, // t

+4

ah, en comparant les booléens ... Non, pas de différence .. – Teson

3

Oui, vous pouvez utiliser XOR à test booléens pour (in) égalité, bien que le code soit moins intuitif: if (x^y) par rapport à if (x != y).

3

Avec des valeurs booléennes, il ne devrait pas y avoir de différence. Vous devriez choisir celui qui convient le mieux à votre sens de l'opération.

Exemple:

bool oldChoice = ...; 
bool newChoice = ...; 
if (oldChoice != newChoice) 
    ... 

Ici XOR donnerait le même résultat, mais ne reflètent pas nécessairement l'intention réelle de code.

19

Comme indiqué dans le Java Language Specification:

Le résultat = est faux si les opérandes sont vraies ou les deux faux; sinon, le résultat est vrai. Ainsi! = Se comporte comme^(§15.22.2) lorsqu'il est appliqué à des opérandes booléens.

En outre, si vous essayez de regarder bytecode un simple extrait:

void test(boolean b1, boolean b2) { 
    boolean res1 = b1^b2; 
    boolean res2 = b1!=b2; 
} 

vous obtenez:

test(ZZ)V 
    L0 
    LINENUMBER 45 L0 
    ILOAD 1 
    ILOAD 2 
    IXOR 
    ISTORE 3 
    L1 
    LINENUMBER 46 L1 
    ILOAD 1 
    ILOAD 2 
    IXOR 
    ISTORE 4 
    L2 
    LINENUMBER 47 L2 
    RETURN 
    L3 

Ceci assure que, en plus de la même sémantique, il n'y a pas tout différence pratique réelle dans la mise en œuvre. (Vous pouvez aussi voir que l'intérieur ints sont utilisés pour stocker des valeurs booléennes)

+0

Merci beaucoup pour cette explication approfondie de la façon dont cela fonctionne! – davidcesarino