Mit Java Bitwise ma­ni­pu­lierst du einzelne Bits ganz nach deinen Vor­stel­lun­gen. Die insgesamt sieben Ope­ra­to­ren sind dabei sehr logisch aufgebaut und folgen klaren Regeln, die du schnell ver­in­ner­licht hast.

Was sind bitweise Ope­ra­to­ren und wofür nutzt man sie?

Java-Ope­ra­to­ren sind ein es­sen­zi­el­les Werkzeug für deine Arbeit mit der Pro­gram­mier­spra­che. Sie bieten dir unter anderem die Mög­lich­keit, die kleinst­mög­li­chen Einheiten an In­for­ma­tio­nen zu verändern. Diese Bits (binary digits) basieren auf einem Zah­len­sys­tem mit den Werten 0 und 1. Wenn du Bi­när­wer­te Bit für Bit abfragen willst, nutzt du in Java einen Bitwise Operator. Diesen wendest du auf nu­me­ri­sche Da­ten­ty­pen wie byte, char, int, short oder long an.

Auch wenn du diese Funktion im Alltag nicht ständig brauchst, ist sie in spe­zi­el­len Szenarien Gold wert. Das gilt etwa, wenn du bei der Da­ten­kon­ver­tie­rung Spei­cher­platz sparen möchtest, den XOR-Operator einsetzt oder gezielt nur ein einziges Bit mo­di­fi­zie­ren willst. Zudem bilden sie das Fundament für komplexe schal­tungs­tech­ni­sche Ope­ra­tio­nen. Es zahlt sich also aus, die Basis von Java Bitwise zu kennen.

Welche Java Bitwise Operators stehen zur Verfügung?

In Java gibt es sieben ver­schie­de­ne Bitwise Operators. Zur Ver­an­schau­li­chung nutzen wir die zwei Operanden „a“ und „b“.

  • ~ (Kom­ple­ment / bitweises Nicht): Dieser Operator kehrt jedes Bit um. Eine 0 wird zur 1 und eine 1 zur 0.
  • & (bitweises Und): Hier wird eine 1 aus­ge­ge­ben, wenn beide Operanden den Wert 1 haben. Sonst ist das Ergebnis 0.
  • | (bitweises Oder): Dieser Operator liefert eine 1, sobald min­des­tens einer der beiden Operanden eine 1 ist.
  • ^ (XOR / bitweises ex­klu­si­ves Oder): Das Ergebnis ist 0, wenn beide Operanden gleich sind. Bei un­ter­schied­li­chen Werten wird eine 1 aus­ge­ge­ben.
  • << (Links­ver­schie­bung): Schiebt Operand a um b Stellen nach links. Die ent­ste­hen­den Lücken werden mit 0 gefüllt.
  • >> (Rechts­ver­schie­bung mit Vor­zei­chen): Ver­schiebt alle Bits von a um b Po­si­tio­nen nach rechts. War das höchst­wer­ti­ge Bit vorher gesetzt, bleibt es das auch danach – so bleiben negative Zahlen negativ.
  • >>> (Rechts­ver­schie­bung ohne Vor­zei­chen): Schiebt die Bits von a um b Stellen nach rechts. Frei werdende Stellen werden kon­se­quent mit 0 auf­ge­füllt.

Bitweises Nicht

Der Java Bitwise Operator „bitweises Nicht“ wird mit einer Tilde (~) ge­schrie­ben. Er negiert sämtliche Bits und tauscht Nullen gegen Einsen (und umgekehrt). Beispiel: Die Zahl 20 lautet binär 10100. Wendest du den Operator an, wird daraus 01011. Das ist das Ergebnis von „~20“. In De­zi­mal­form ent­spricht dieser Binärwert -21. Um das im Code zu testen, nutzt du den Java-Befehl System.out.println für die Ausgabe.

public class Main {
	public static void main(String[] args) {
	int Wert1 = 20;
	System.out.println(~Wert1);
}
}
java

Bei korrekter Eingabe erscheint in der Konsole der Wert „-21“.

Bitweises Und

Das bitweise Und ver­gleicht zwei Bi­när­zah­len Stelle für Stelle. Das erste Bit der ersten Zahl wird mit dem ersten Bit der zweiten Zahl ab­ge­gli­chen und so weiter. Nur wenn beide Bits 1 sind, ist auch das Er­geb­nis­bit 1. In allen anderen Fällen (0 und 0 oder 1 und 0) re­sul­tiert eine 0. Nehmen wir die De­zi­mal­zah­len 18 (binär 10010) und 25 (binär 11001). Un­ter­ein­an­der ge­schrie­ben sieht das so aus:

18 = 10010 25 = 11001

Die ersten Bits sind jeweils 1, also beginnt das Ergebnis mit 1. Das zweite Bit von 25 ist zwar 1, aber bei 18 steht dort eine 0 – das Er­geb­nis­bit wird also 0. Bit für Bit geprüft ergibt sich die Binärzahl 10000. Dezimal um­ge­rech­net ist das die 16.

Der Code dazu:

public class Main {
	public static void main(String[] args) {
	System.out.println(18&25);
}
}
java

Die Konsole gibt hier „16“ aus.

Bitweises Oder

Auch der Operator „bitweises Oder“ ver­gleicht zwei Zahlen Bit für Bit. Hier reicht es jedoch, wenn min­des­tens einer der Operanden eine 1 hat, um im Ergebnis eine 1 zu erhalten. Bei 18 und 25 sieht das Ganze so aus:

18 = 10010 25 = 11001

Da bis auf die mittlere Stelle überall min­des­tens eine 1 vorkommt, entsteht die Binärzahl 11011. Das ent­spricht der De­zi­mal­zahl 27.

Beispiel im Code:

public class Main {
	public static void main(String[] args) {
	System.out.println(18|25);
}
}
java

XOR

XOR be­zie­hungs­wei­se „bitweise ex­klu­si­ves Oder“ (^) funk­tio­niert fast wie das normale Oder. Der ent­schei­den­de Un­ter­schied: XOR gibt nur dann eine 1 aus, wenn exakt einer der beiden Werte 1 ist. Unser Beispiel macht das deutlich:

18 = 10010 25 = 11001

Die ersten Bits sind beide 1, was bei diesem Operator 0 ergibt. Das zweite Bit bei 18 ist 0, bei 25 jedoch 1 – daraus folgt eine 1. Am Ende erhalten wir die Binärzahl 01011, was dezimal 11 ergibt.

Passender Code-Schnipsel:

public class Main {
	public static void main(String[] args) {
	System.out.println(18^25);
}
}
java

Links­ver­schie­bung

Bei der Links­ver­schie­bung rückst du die Bits von Wert a um den Faktor b nach links. Die Lücken füllst du mit 0 auf. Ein int-Wert belegt im Speicher 32 Bit. Nehmen wir für a wieder die 20 (10100). Ver­schie­ben wir diese um b = 2 nach links, ergibt sich 1010000. Es werden also zwei Nullen angehängt, was dem De­zi­mal­wert 80 ent­spricht.

So setzt du das im Code um:

public class Main {
	public static void main(String[] args) {
	int a = 20;
	int b = 2;
	int c = (a << b);
	System.out.println(c);
}
}
java

Rechts­ver­schie­bung mit Vor­zei­chen

Hier erfolgt die Ver­schie­bung in die andere Richtung. Wir rücken die Bits von a um b Stellen nach rechts. Die hinteren Bits fallen weg. Schieben wir die 20 (10100) um zwei Stellen nach rechts, bleibt 101 (dezimal 5) übrig.

Code zum Aus­pro­bie­ren:

public class Main {
	public static void main(String[] args) {
	System.out.println(20 >> 2);
}
}
java

Beachte: Die Lücken werden mit 0 gefüllt, wenn a positiv ist. Bei einem negativen Wert für a werden sie mit 1 auf­ge­füllt.

Rechts­ver­schie­bung ohne Vor­zei­chen

Der Operator >>> funk­tio­niert fast identisch zur normalen Rechts­ver­schie­bung. Der Clou: Die links ent­ste­hen­den Leer­stel­len werden kon­se­quent mit 0 auf­ge­füllt. Das führt dazu, dass das Ergebnis immer eine positive Zahl ist, selbst wenn der Aus­gangs­wert negativ war. 63918bf29b2b49202e1815d2336b7f74

Zum Hauptmenü