Java hat Operatoren, mit denen du die Bits eines integralen Typs manipulieren kannst (ein byte, short, int, long oder char).
Mit << verschiebst du Bits nach links und mit >> nach rechts.
// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100
// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010
>> wird auch als vorzeichenbehafteter oder arithmetischer Schiebeoperator bezeichnet, weil das Bit, das er einfügt, dasselbe ist wie sein Vorzeichenbit.
Das ist das am weitesten links stehende Bit und es ist 0, wenn der Wert positiv ist, oder 1, wenn er negativ ist.
Beim Verschieben nach links mit << werden immer Nullen auf der rechten Seite eingefügt.
// Shift 2 places to the right preserves the sign
// The binary value is two's complement of 0b0000_0110 (or 0x00000026), so the binary representation will be
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;
// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001
Verwende stattdessen >>>, wenn beim Verschieben nach rechts Nullen eingefügt werden sollen.
Das Einfügen von Nullen beim Verschieben wird auch als logisches Verschieben bezeichnet.
// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001
Der bitweise UND-Operator (&) nimmt zwei Werte und führt ein UND auf jedem Bit aus.
Er vergleicht jedes Bit des ersten Werts mit dem Bit an derselben Position des zweiten Werts.
Wenn beide 1 sind, dann ist das Bit des Ergebnisses 1.
Andernfalls ist das Bit des Ergebnisses 0.
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
Der bitweise ODER-Operator (|) nimmt zwei Werte und führt ein ODER auf jedem Bit aus.
Er vergleicht jedes Bit des ersten Werts mit dem Bit an derselben Position des zweiten Werts.
Wenn eines der beiden Bits 1 ist, ist das Bit des Ergebnisses 1.
Andernfalls ist es 0.
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
Der bitweise XOR-Operator (^) führt ein bitweises XOR auf zwei Werten aus.
Wie die Operatoren für bitweises UND und bitweises ODER vergleicht er jedes Bit des ersten Werts mit dem Bit an derselben Position des zweiten Werts.
Wenn nur eines von beiden 1 ist, ist das resultierende Bit 1.
Andernfalls ist es 0.
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)Zuletzt kehrt der bitweise NICHT-Operator (~) jedes Bit um.
Anders als die vorherigen Operatoren ist dies ein unärer Operator, der nur auf einen Wert wirkt.
~0b0110_0101;
// # => 0b1001_1010