2010-11-14 6 views
21

Meine Frage verwendet Java als Beispiel, aber ich denke, es gilt für wahrscheinlich alle.Was ist der Unterschied zwischen XOR und NOT-EQUAL-TO?

Gibt es einen praktischen Unterschied zwischen dem XOR-Operator (^ in Java) und dem NOT-EQUAL-TO (! = In Java), wenn booleans verglichen werden?

Ich habe die Dinge hier ausgewertet, aber ich habe mich immer wieder gefragt (scheint komisch, zwei Dinge gleich) ... und habe nichts im Netz gefunden. Nur eine Diskussion in einem Forum, die schnell und ohne Ergebnis endete.

+0

Einige ähnliche Diskussion in dieser Frage (ich persönlich würde es nicht als ein Duplikat, pro sagen): http://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the- xor-operator-in-java-für-boolean-checks – eldarerathis

+0

Eine Tangentiale Notiz: Wie die Antworten unten gesagt haben, bedeuten die beiden Operatoren dasselbe für Booleans. Dies gilt im allgemeinen Fall zumindest in C++ nicht. Da Operatoren in C++ überladen werden können, können die Operatoren '! =' Und '^' dasselbe tun oder auch nicht. Außerdem macht die Verwendung von '! =' Im Gegensatz zu '^' ziemlich klar, dass ein Test der Ungleichheit durchgeführt wird. –

+0

Es tut mir leid, ich habe diese Frage nicht einmal gesehen, vielleicht, weil die Titel unterschiedlich sind und der Frageverifikator es nicht verstanden hat. Wie auch immer, die Antworten hier waren viel besser und erleuchteter, meiner bescheidenen Meinung nach. Über das, was dort gesagt wird ... Ich stimme dem zu: Wenn du einen von wenigen Buchstaben speichern willst, die den Code undurchsichtiger machen, werde ich lieber etwas ausführlicher. Ich bleibe bei! = In diesen Situationen. – davidcesarino

Antwort

26

Für Boolesche Werte bedeuten, dass sie die gleiche Sache - obwohl es eine Verbindung Zuweisungsoperator ist für XOR:

x ^= y; 

Es gibt keine äquivalente Verbindung Zuordnung Operator für Ungleichheit.

Warum beide verfügbar sind - es wäre seltsam für XOR nicht zur Verfügung, nur weil es genauso wie Ungleichheit funktioniert. Es sollte logischerweise da sein, so ist es. Bei nicht-booleschen Typen ist das Ergebnis anders, weil es sich um einen anderen Ergebnistyp handelt, aber das bedeutet nicht, dass es sinnvoll wäre, XOR für boolean zu entfernen.

+0

Ja, das waren meine Gedanken genau! Ich wollte nur sicherstellen, dass ich im Allgemeinen nicht viele Dinge sehe, die im Wesentlichen die gleichen sind und demselben Zweck dienen (ein Occam-Rasierer, denke ich ...). Diese Bedenken gelten offensichtlich nicht für das ternäre System, was natürlich ein besserer und saubererer Weg ist, dasselbe zu tun. Aber bei meinem Fall ist es genau so. Aber ja, du warst genau auf dem Punkt des Problems und meiner Frage. Vielen Dank. – davidcesarino

0

Sie sollten in diesem Fall im Wesentlichen gleich sein.

0

Es ist ein großer Unterschied, arbeitet XOR auf Bit-Ebene, Unterschiede als diejenigen zu halten, so 0b0011 xor 0b1101 => 0b1110

Grüßen, // t

+4

ah, booleans vergleichen ... Nein, kein Unterschied .. – Teson

3

Ja, können Sie XOR verwenden, um boolesche Tests auf (Gleichheit) testen, obwohl der Code weniger intuitiv ist: if (x^y) versus if (x != y).

3

Mit booleschen Werten sollte es keinen Unterschied geben. Sie sollten wählen, was für Ihren Sinn der Operation angemessener ist.

Beispiel:

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

Hier XOR würde das gleiche Ergebnis, aber nicht die echte Code Absicht widerspiegelt.

19

Wie in derJava Language Specification angegeben:

Das Ergebnis = ist falsch, wenn die Operanden beide wahr oder beide falsch sind; Ansonsten ist das Ergebnis wahr. Somit verhält sich! = Genau wie^(§15.22.2), wenn es auf boolesche Operanden angewendet wird.

Außerdem, wenn man sich Bytecode eines einfachen Snippet suchen versuchen:

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

erhalten Sie:

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 

Dies stellt sicher, dass zusätzlich zu der gleichen Semantik, da keine irgendeine tatsächlich praktischer Unterschied in der Umsetzung. (Sie können auch sehen, dass intern Ints verwendet werden Boolesche Werte speichern)

+0

Vielen Dank für diese tiefe Erklärung, wie es funktioniert! – davidcesarino