Java Bitwise: Operatoren und Funktionen im Überblick
Mit Java Bitwise manipulierst du einzelne Bits ganz nach deinen Vorstellungen. Die insgesamt sieben Operatoren sind dabei sehr logisch aufgebaut und folgen klaren Regeln, die du schnell verinnerlicht hast.
Was sind bitweise Operatoren und wofür nutzt man sie?
Java-Operatoren sind ein essenzielles Werkzeug für deine Arbeit mit der Programmiersprache. Sie bieten dir unter anderem die Möglichkeit, die kleinstmöglichen Einheiten an Informationen zu verändern. Diese Bits (binary digits) basieren auf einem Zahlensystem mit den Werten 0 und 1. Wenn du Binärwerte Bit für Bit abfragen willst, nutzt du in Java einen Bitwise Operator. Diesen wendest du auf numerische Datentypen wie byte, char, int, short oder long an.
Auch wenn du diese Funktion im Alltag nicht ständig brauchst, ist sie in speziellen Szenarien Gold wert. Das gilt etwa, wenn du bei der Datenkonvertierung Speicherplatz sparen möchtest, den XOR-Operator einsetzt oder gezielt nur ein einziges Bit modifizieren willst. Zudem bilden sie das Fundament für komplexe schaltungstechnische Operationen. 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 verschiedene Bitwise Operators. Zur Veranschaulichung nutzen wir die zwei Operanden „a“ und „b“.
- ~ (Komplement / bitweises Nicht): Dieser Operator kehrt jedes Bit um. Eine 0 wird zur 1 und eine 1 zur 0.
- & (bitweises Und): Hier wird eine 1 ausgegeben, wenn beide Operanden den Wert 1 haben. Sonst ist das Ergebnis 0.
- | (bitweises Oder): Dieser Operator liefert eine 1, sobald mindestens einer der beiden Operanden eine 1 ist.
- ^ (XOR / bitweises exklusives Oder): Das Ergebnis ist 0, wenn beide Operanden gleich sind. Bei unterschiedlichen Werten wird eine 1 ausgegeben.
- << (Linksverschiebung): Schiebt Operand a um b Stellen nach links. Die entstehenden Lücken werden mit 0 gefüllt.
- >> (Rechtsverschiebung mit Vorzeichen): Verschiebt alle Bits von a um b Positionen nach rechts. War das höchstwertige Bit vorher gesetzt, bleibt es das auch danach – so bleiben negative Zahlen negativ.
- >>> (Rechtsverschiebung ohne Vorzeichen): Schiebt die Bits von a um b Stellen nach rechts. Frei werdende Stellen werden konsequent mit 0 aufgefüllt.
Bitweises Nicht
Der Java Bitwise Operator „bitweises Nicht“ wird mit einer Tilde (~) geschrieben. 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 Dezimalform entspricht 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);
}
}javaBei korrekter Eingabe erscheint in der Konsole der Wert „-21“.
Bitweises Und
Das bitweise Und vergleicht zwei Binärzahlen Stelle für Stelle. Das erste Bit der ersten Zahl wird mit dem ersten Bit der zweiten Zahl abgeglichen und so weiter. Nur wenn beide Bits 1 sind, ist auch das Ergebnisbit 1. In allen anderen Fällen (0 und 0 oder 1 und 0) resultiert eine 0. Nehmen wir die Dezimalzahlen 18 (binär 10010) und 25 (binär 11001). Untereinander geschrieben 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 Ergebnisbit wird also 0. Bit für Bit geprüft ergibt sich die Binärzahl 10000. Dezimal umgerechnet ist das die 16.
Der Code dazu:
public class Main {
public static void main(String[] args) {
System.out.println(18&25);
}
}javaDie Konsole gibt hier „16“ aus.
Bitweises Oder
Auch der Operator „bitweises Oder“ vergleicht zwei Zahlen Bit für Bit. Hier reicht es jedoch, wenn mindestens 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 mindestens eine 1 vorkommt, entsteht die Binärzahl 11011. Das entspricht der Dezimalzahl 27.
Beispiel im Code:
public class Main {
public static void main(String[] args) {
System.out.println(18|25);
}
}javaXOR
XOR beziehungsweise „bitweise exklusives Oder“ (^) funktioniert fast wie das normale Oder. Der entscheidende Unterschied: 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);
}
}javaLinksverschiebung
Bei der Linksverschiebung 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). Verschieben wir diese um b = 2 nach links, ergibt sich 1010000. Es werden also zwei Nullen angehängt, was dem Dezimalwert 80 entspricht.
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);
}
}javaRechtsverschiebung mit Vorzeichen
Hier erfolgt die Verschiebung 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 Ausprobieren:
public class Main {
public static void main(String[] args) {
System.out.println(20 >> 2);
}
}javaBeachte: Die Lücken werden mit 0 gefüllt, wenn a positiv ist. Bei einem negativen Wert für a werden sie mit 1 aufgefüllt.
Rechtsverschiebung ohne Vorzeichen
Der Operator >>> funktioniert fast identisch zur normalen Rechtsverschiebung. Der Clou: Die links entstehenden Leerstellen werden konsequent mit 0 aufgefüllt. Das führt dazu, dass das Ergebnis immer eine positive Zahl ist, selbst wenn der Ausgangswert negativ war. 63918bf29b2b49202e1815d2336b7f74