HOWTO · Java

Der XOR-Operator in Java

Verwenden Sie den Operator ^ von Java für boolesches und ganzzahliges XOR, mit getesteten Beispielen und häufigen Fallstricken.

Auf dieser Seite

In Java ist ^ der XOR-Operator (exklusives Oder). Verwenden Sie ihn mit boolean-Werten, wenn genau eine Bedingung wahr sein soll, oder mit Ganzzahlen für bitweises XOR. Er ist kein Potenzierungsoperator: Java besitzt keinen Operator **. Die Java Language Specification definiert beide Formen von ^.

Wählen Sie die boolesche Form für Bedingungen und die ganzzahlige Form für Bits oder Masken. Der Operator ist in aktuellen Java-Versionen verfügbar; die Beispiele wurden mit OpenJDK 17.0.20.1 ausgeführt, während die Vorbereitung die aktuelle JDK-26-Releaseinformation berücksichtigte.

XOR mit booleschen Werten verwenden

Bei zwei booleschen Operanden ist XOR nur dann true, wenn sich die Operanden unterscheiden. Die Wahrheitstabelle ist einfach:

Links Rechts left ^ right
false false false
false true true
true false true
true true false

Anders als && und || wertet ^ beide Operanden aus. Verwenden Sie es nicht als Ersatz für eine Kurzschlussprüfung wie value != null && value.isReady(): Der Methodenaufruf wird dennoch ausgewertet. Nutzen Sie es, wenn beide booleschen Ausdrücke gefahrlos ausgewertet werden können und „genau einer“ die Regel ist.

Dieses getestete Beispiel zeigt boolesches XOR und ganzzahliges XOR zusammen:

public class BooleanAndIntegerXor {
  public static void main(String[] args) {
    System.out.println(true ^ false);
    System.out.println(true ^ true);
    System.out.println(0b1100 ^ 0b1010);
  }
}

Ausgabe:

true
false
6

Die ersten beiden Zeilen zeigen die boolesche Regel. Bei Ganzzahlen ergibt 0b1100 ^ 0b1010 den Wert 0b0110, also dezimal 6: Ein Ergebnisbit ist nur dort 1, wo sich die Eingabebits unterscheiden.

XOR mit Ganzzahlen und Masken verwenden

Die bitweise Form akzeptiert ganzzahlige primitive Typen wie byte, short, char, int und long. Java führt vor der Operation die binäre numerische Promotion durch; Ausdrücke mit kleineren Ganzzahltypen haben deshalb häufig ein Ergebnis vom Typ int. float und double können keine XOR-Operanden sein. Wandeln Sie nur um, wenn der Zieltyp dies wirklich verlangt; ein Cast kann Bits verwerfen.

XOR eignet sich zum Umschalten ausgewählter Bits. Wenn flags eine Ganzzahl ist und mask die zu ändernden Bits kennzeichnet, kehrt flags ^ mask genau diese Bits um. Dieselbe Maske ein zweites Mal anzuwenden, stellt die ursprünglichen Bits wieder her, weil x ^ y ^ y gleich x ist. Diese umkehrbare Eigenschaft ist für kontrollierte Bitmanipulation nützlich, ersetzt aber keine klarere Anwendungslogik.

Einen Wert ohne Paar finden

Eine kompakte Anwendung von ganzzahligem XOR findet einen Wert, wenn jeder andere Wert genau zweimal vorkommt. Gleiche Werte heben sich auf, weil x ^ x gleich 0 und 0 ^ x gleich x ist.

public class UniqueNumberXor {
  public static void main(String[] args) {
    int unique = 0;
    for (int value : new int[] {4, 9, 4}) {
      unique ^= value;
    }
    System.out.println(unique);
  }
}

Ausgabe:

9

Dies ist eine Technik mit empfindlichen Randbedingungen, kein allgemeiner Algorithmus zum Finden einer eindeutigen Zahl. Sie funktioniert nur, wenn ein Wert ungepaart ist und jeder andere Wert genau zweimal vorkommt. Sie identifiziert beispielsweise keinen einzelnen eindeutigen Wert, wenn ein anderer Wert dreimal vorkommt. Wählen Sie einen Zählansatz, wenn die Vorkommensregel anders ist oder Sie zusätzlich Häufigkeiten benötigen.

Wo klare Alternativen besser passen

Verwenden Sie !=, wenn Sie zwei boolesche Werte auf Ungleichheit vergleichen; damit kann die Absicht direkter erkennbar sein als mit ^. Verwenden Sie & 1, um zu prüfen, ob eine Ganzzahl gerade oder ungerade ist – die Paritätsoperation ist AND, nicht XOR. Das Tauschen zweier Variablen mit XOR ist zwar ein bekannter Trick, aber eine temporäre Variable oder eine normale Zuweisung ist in Java klarer und vermeidet Alias-Fehler.

Der entscheidende Unterschied ist daher einfach: ^ bedeutet exklusives Oder für boolean-Werte und bitweises XOR für Ganzzahlen. Prüfen Sie die Operandentypen, denken Sie daran, dass beide booleschen Seiten ausgewertet werden, und benennen Sie die Datenannahmen, bevor Sie sich auf das Aufheben doppelter Werte verlassen.