Java Bitwise: Die Operatoren und ihre Funktion in der Übersicht

Mit Java Bitwise können Sie einzelne Bits nach Belieben manipulieren. Die insgesamt sieben Operatoren sind dabei immer sehr ähnlich aufgebaut und folgen festen Regeln, die leicht zu erlernen sind.

Was sind bitweise Operatoren und wofür werden sie benötigt?

Java-Operatoren sind ein besonders wichtiges Werkzeug in der Arbeit mit der Programmiersprache. Neben vielen anderen Möglichkeiten und Funktionen geben sie Ihnen die Option, die kleinstmöglichen Informationseinheiten zu manipulieren. Diese Bits (binary digits) haben ein eigenes Zahlensystem, das auf den Werten 0 und 1 basiert. Wenn Sie nun Binärwerte Bit für Bit abfragen möchten, benötigen Sie einen Bitwise Operator in Java. Diesen können Sie auf die numerischen Datentypen (byte, char, int, short, long) anwenden.

Zwar werden Sie die Funktion im Alltag nicht täglich benötigen, in einigen Fällen ist die Anwendung aber dennoch sinnvoll. Das gilt zum Beispiel, wenn Sie bei der Konvertierung von Daten Platz sparen wollen, den XOR-Operator verwenden oder eben wirklich nur ein einziges Bit verändern möchten. Außerdem sind sie die Basis für alle höheren schaltungstechnischen Operationen. Es lohnt sich also, die grundsätzliche Funktionsweise von Java Bitwise zu verstehen.

Günstige Webhosting-Pakete von IONOS!

Vertrauen Sie auf flexibel skalierbares und zuverlässiges Webhosting inklusive persönlichem Berater mit IONOS!

Kostenlose Domain
SSL Zertifikat
DDoS-Schutz

Welche Java Bitwise Operators gibt es?

Es gibt insgesamt sieben verschiedene Bitwise Operators in Java. Zum besseren Verständnis gehen wir von den zwei Operanden „a“ und „b“ aus.

  • ~ (Komplement oder auch „bitweises Nicht“): Dieser Operator invertiert jedes Bit. Aus einer 0 wird somit eine 1 und aus einer 1 eine 0.
  • & („bitweises Und“): Dieser Operator gibt eine 1 aus, sofern beide Operanden auch 1 sind. Ist dies nicht der Fall, wird eine 0 ausgegeben.
  • | („bitweises Oder“): Dieser Operator produziert eine 1, sofern einer der beiden Operanden ebenfalls diesen Wert hat.
  • ^ (XOR oder „bitweises exklusives Oder“): Dieser Operator gibt eine 0 aus, sofern beide Operanden denselben Wert haben. Andernfalls produziert er eine 1.
  • << (Linksverschiebung): Dieser Operator verschiebt Operand a um b Positionen nach links. Entstehen dadurch Leerstellen, werden diese mit 0 aufgefüllt.
  • >> (Rechtsverschiebung mit Vorzeichen, arithmetisch): Dieser Operator verschiebt alle Bits von a um b Positionen nach rechts. Falls das Bit mit dem höchsten Wert auch vor Durchführung gesetzt war, bleibt es auch danach gesetzt. Negative Zahlen bleiben dadurch negativ.
  • >>> (Rechtsverschiebung ohne Vorzeichen, logisch): Dieser Operator schiebt die Bits von a um b Positionen nach rechts. Leerstellen werden immer mit 0 aufgefüllt.

Bitweises Nicht

Der Java Bitwise Operator „bitweises Nicht“ wird durch eine Tilde (~) dargestellt. Er negiert alle Bits und macht somit aus Nullen Einsen und aus Einsen Nullen. Für unser Beispiel nehmen wir die Zahl 20. Als Binärzahl sieht diese so aus: 10100. Wenden wir jetzt den Operator an, schaltet dieser jedes Bit der Zahl um. Aus 10100 wird durch den Operator also 01011. Dies ist der Wert des Ausdrucks „~20“. Rechnen wir diese Binärzahl wieder zur Dezimalzahl um, erhalten wir den Wert -21. Wenn Sie diesen Vorgang im Code ausprobieren möchten, geben Sie Folgendes ein und erwirken eine Ausgabe mit dem Java-Befehl System.out.println.

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

Wenn Sie alles richtig eingegeben haben, sollte die Ausgabe nun „-21“ lauten.

Bitweises Und

Das bitweise Und vergleicht zwei Zahlen in ihrer binären Form Bit für Bit. Das erste Bit der ersten Zahl wird somit mit dem ersten Bit der zweiten Zahl abgeglichen, das zweite mit dem zweiten Bit und so weiter. Wenn beide Bits 1 sind, wird auch eine 1 ausgegeben. Ist dies nicht der Fall, da entweder beide Bits oder nur ein Bit 0 ist, wird eine 0 ausgegeben. Für unser Beispiel nehmen wir die beiden Dezimalzahlen 18 und 25. 18 als Binärzahl lautet 10010. Die 25 ergibt in binärer Schreibweise 11001. Diese beiden Zahlen vergleichen wir jetzt miteinander und ermitteln daraus eine dritte Zahl. Zur besseren Übersicht schreiben wir Sie hier untereinander:

18 = 10010 25 = 11001

Die beiden ersten Bits sind in beiden Fällen 1. Somit beginnt auch unsere gesuchte Zahl mit 1. Zwar lautet das zweite Bit von 25 ebenfalls 1, das zweite Bit von 18 ist aber 0, weshalb auch die dritte Zahl mit 0 weitergeht. So gehen wir beide Zahlen Bit für Bit durch und erhalten schließlich die Binärzahl 10000. Konvertieren wir diese zu einer Dezimalzahl, lautet unsere Ausgabe 16.

Im Code sieht das aus wie folgt:

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

Die Ausgabe in der Konsole sollte nun „16“ lauten.

Bitweises Oder

Der Java Bitwise Operator „bitweises Oder“ vergleicht ebenfalls zwei Zahlen Bit für Bit. In diesem Fall muss aber nur einer der beiden Operanden den Wert 1 haben, um als Ergebnis 1 zu erhalten. Nehmen wir wieder die 18 und 25 vom vorherigen Beispiel, sieht das so aus:

18 = 10010 25 = 11001

Da außer der dritten Stelle alle Bits mindestens eine 1 enthalten, ergibt sich diese dritte Zahl: 11011. Umgerechnet erhalten wir also die 27.

So sieht dieses Beispiel im Code aus:

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

XOR

XOR oder auch „bitweise exklusives Oder“ (^) ähnelt dem bitweisen Oder. Während aber bei diesem wahlweise einer oder beide Operanden 1 sein müssen, gibt XOR nur dann eine 1 aus, wenn genau einer der beiden Werte auch 1 ist. Verständlich wird das bei einem Blick auf unser Beispiel:

18 = 10010 25 = 11001

Die ersten beiden Bits haben den Wert 1, ergeben also bei diesem Bitwise Operator in Java 0. Das zweite Bit von 18 ist 0, das von 25 aber 1. Daraus ergibt sich der Wert 1. Gehen wir weiter durch, erhalten wir die dritte Zahl 01011. In Dezimalform lautet diese 11.

Dies ist der passende Code:

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

Linksverschiebung

Bei der Linksverschiebung verschieben Sie die Bits des Wertes a um die Distanz b nach links. Die daraus entstehenden Leerstellen werden mit 0 aufgefüllt. Dies lässt sich gut an einem int-Wert veranschaulichen, der in einem Speicher 32 Bit belegt. Nehmen wir als Zahl a wieder die 20 bzw. 10010. Verschieben wir diese um den b-Wert 2, erhalten wir den c-Wert 1001000. Es werden also zwei Nullen an das Ende gesetzt. 1001000 entspricht dem Dezimalwert 72.

So sieht dieser Vorgang im Code aus:

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

Rechtsverschiebung mit Vorzeichen

Die Rechtsverschiebung funktioniert genau andersherum. Wir schieben die Bits des a-Wertes also um den Wert b nach rechts und erhalten so c. Die letzten Bits fallen dadurch weg. Wenn wir in unserem Beispiel die 20 oder 10010 um zwei Stellen nach rechts rücken, erhalten wir als Ergebnis 100 oder 4.

Dies ist der Code zum Ausprobieren:

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

Wichtig ist hierbei zu beachten, dass die Leerstellen mit 0 aufgefüllt werden, sofern a eine positive Zahl ist. Ist sie negativ, werden die Leerstellen mit 1 ersetzt.

Rechtsverschiebung ohne Vorzeichen

Der Java Bitewise Operator Rechtsverschiebung ohne Vorzeichen (>>>) funktioniert im Prinzip genauso. Der einzige Unterschied ist, dass die Leerstellen, die auf der linken Seite durch eine Verschiebung nach rechts entstehen, immer mit 0 aufgefüllt werden. Dadurch entstehen am Ende immer positive Zahlen, selbst wenn der Wert vorher negativ war.