---
title: 'Inselraus: Variablen mit Xor vertauschen'
url: 'https://www.tutego.de/blog/javainsel/2012/05/inselraus-variablen-mit-xor-vertauschen'
markdown: 'https://www.tutego.de/blog/javainsel/2012/05/inselraus-variablen-mit-xor-vertauschen.md'
date: '2012-05-27'
description: "Eine besonders trickreiche Idee für das Vertauschen von Variableninhalten arbeitet mit dem Xor-Operator und benötigt keine temporäre Zwischenvariable. Die Zeilen zum Vertauschen von x und y lauten wie folgt: int x = 12, \_\_\_ y = 49; x ^= y; // x = x ^ y = 001100bin ^ 110001bin = 111101bin …"
taxonomy:
  category:
    - Insel
---

# Inselraus: Variablen mit Xor vertauschen

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://www.tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://www.tutego.de/blog/javainsel/)

## Inselraus: Variablen mit Xor vertauschen

27.05.2012 · [Christian Ullenboom](https://www.tutego.de/blog/javainsel/author/admin/)

Eine besonders trickreiche Idee für das Vertauschen von Variableninhalten arbeitet mit dem Xor-Operator und benötigt keine temporäre Zwischenvariable. Die Zeilen zum Vertauschen von x und y lauten wie folgt:

```java
int x = 12, 
      y = 49; 

  x ^= y; // x = x ^ y = 001100bin ^ 110001bin = 111101bin 

  y ^= x; // y = y ^ x = 110001bin ^ 111101bin = 001100bin 

  x ^= y; // x = x ^ y = 111101bin ^ 001100bin = 110001bin 

  System.out.println( x + " " + y );  // Ausgabe ist: 49 12
```

Der Trick funktioniert, da wir mit Xor etwas »hinein- und herausrechnen« können. Zuerst rechnet die erste Zeile das y in das x. Wenn wir anschließend die Zuweisung an das y machen, dann ist das der letzte schreibende Zugriff auf y, also muss hier schon das vertauschte Ergebnis stehen. Das stimmt auch, denn expandieren wir die zweite Zeile, steht dort: »y ^ x wird zugewiesen an y«, und dies ist y ^ (x ^ y). Der letzte Ausdruck verkürzt sich zu y = x, da aus der Definition des Xor-Operators für einen Wert a hervorgeht: a ^ a = 0. Die Zuweisung hätten wir zwar gleich so schreiben können, aber dann wäre der Wert von y verloren gegangen. Der steckt aber noch in x aus der ersten Zuweisung. Betrachten wir daher die letzte Zeile x ^ y: y hat den Startwert von x, doch in x steckt ein Xor-y. Daher ergibt x ^ y den Wert x ^ x ^ y, und der verkürzt sich zu y. Demnach haben wir den Inhalt der Variablen vertauscht. Im Übrigen können wir für die drei Xor-Zeilen alternativ schreiben:

```java
y ^= x ^= y;   // Auswertung automatisch y ^= (x ^= y) 
  x ^= y;
```

Da liegt es doch nahe, die Ausdrücke weiter abzukürzen zu x ^= y ^= x ^= y. Doch leider ist das falsch (es kommt für x immer `null` heraus). Motivierten Lesern bleibt dies als Denksportaufgabe überlassen.

Kategorien: [Insel](https://www.tutego.de/blog/javainsel/category/insel/)

## 5 Kommentare

**Nett, Inhalt von Variablen tauschen ohne Hilfsvariable :-) | Sent from Hauptstadt!** · [25.11.2012 16:19](#comment-4351)

\\\[...\\\] Inhalt von Variablen tauschen ohne Hilfsvariable :-) Inselraus: Variablen mit Xor vertauschen Eine besonders trickreiche Idee für das Vertauschen von Variableninhalten arbeitet mit dem \\\[...\\\]

**Nett, Inhalt von Variablen tauschen ohne Hilfsvariable :-) | Sent from Hauptstadt!** · [10.06.2012 22:09](#comment-4120)

\\\[...\\\] Inhalt von Variablen tauschen ohne Hilfsvariable :-) Inselraus: Variablen mit Xor vertauschen Eine besonders trickreiche Idee für das Vertauschen von Variableninhalten arbeitet mit dem \\\[...\\\]

**ufkub** · [29.05.2012 17:38](#comment-4103)

In einer Zeile geht es angeblich so: "y=(x^=(y^=x))^y;" Buchtipp: Java Puzzlers, Puzzle 7: "Swap Meat"

**ahoi** · [27.05.2012 12:38](#comment-4102)

@foomatic: Das dachte ich auch als ich das gelesen habe. Die Kunst ist nicht Code zu schreiben, den der Computer versteht - jeder kann kryptischen Code schreiben -, sondern Code, den Menschen verstehen. Da kann er auch noch so clever/performant/speichersparend sein.

**foomatic** · [27.05.2012 10:28](#comment-4101)

Eine schöne Variante um unwartbaren Code zu generieren.

Die bisherigen Kommentare wurden aus WordPress übernommen. Neue Kommentare sind derzeit geschlossen.

[← Alle Beiträge](https://www.tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [Snippet: Hex-Code für Anfang eines Byte-Arrays ausgeben](https://www.tutego.de/blog/javainsel/2012/05/snippet-hex-code-fr-anfang-eines-byte-arrays-ausgeben.md)
- Next: [Inselraus: Swing/Auswahlmenü mit Separator](https://www.tutego.de/blog/javainsel/2012/05/inselraus-swingauswahlmen-mit-separator.md)
