Java hat Operatoren, mit denen du die Bits eines byte, short, int, long oder char bearbeiten kannst.
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
Der Operator << fügt auf der rechten Seite immer Nullen ein.
Der Operator >> hingegen fügt dasselbe Bit ein wie das am weitesten links stehende Bit (1, wenn die Zahl negativ ist, und 0, wenn sie positiv ist).
// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 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.
// 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 für jedes Bit ein UND aus.
Er vergleicht jedes Bit des ersten Werts mit dem Bit an derselben Position im zweiten Wert.
Sind beide 1, 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 für jedes Bit ein ODER aus.
Er vergleicht jedes Bit des ersten Werts mit dem Bit an derselben Position im zweiten Wert.
Ist eines der beiden Bits 1, 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 mit 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 im zweiten Wert.
Ist nur eines von beiden 1, ist das resultierende Bit 1.
Andernfalls ist es 0.
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)Zuletzt: Der bitweise NOT-Operator (~) kehrt jedes Bit um.
Anders als die bisherigen Operatoren ist er ein unärer Operator und wirkt nur auf einen einzigen Wert.
~0b0110_0101;
// # => 0b1001_1010
Dein Freund hat dir gerade eine Nachricht mit einem wichtigen Geheimnis geschickt. Damit es andere nicht so leicht lesen können, wurde die Nachricht durch eine Reihe von Bitmanipulationen verschlüsselt. Du musst die Methoden schreiben, mit denen du die Nachricht entschlüsseln kannst.
Der erste Schritt beim Entschlüsseln der Nachricht ist, die Verschiebung aus dem Verschlüsselungsprozess rückgängig zu machen, indem du die Bits wieder nach rechts verschiebst. In den weiteren Schritten des Entschlüsselungsprozesses wird davon ausgegangen, dass von links Nullen eingefügt werden.
Implementiere die Methode Secrets.shiftBack, die einen Wert und die Anzahl der Stellen zum Verschieben entgegennimmt und die Verschiebung durchführt.
Secrets.shiftBack(0b1001, 2);
# => 0b0010
Als Nächstes gibt es einige Bits, die auf 1 gesetzt werden müssen.
Implementiere die Methode Secrets.setBits, die einen Wert und eine Maske entgegennimmt und das Ergebnis davon zurückgibt, die Bits im Wert auf 1 zu setzen.
Ein Bit aus dem Wert sollte auf 1 gesetzt werden, wenn das entsprechende Bit in der Maske ebenfalls 1 ist.
Alle anderen Bits bleiben unverändert.
Secrets.setBits(0b0110, 0b0101);
# => 0b0111
Beim Verschlüsseln werden einige Bits umgedreht. Sie müssen wieder zurückgedreht werden, um die Nachricht zu entschlüsseln.
Implementiere die Methode Secrets.flipBits, die einen Wert und die Maske entgegennimmt.
Die Maske gibt an, welche Bits im Wert umgedreht werden sollen.
Wenn das Bit in der Maske 1 ist, wird das Bit im Wert umgedreht.
Alle anderen Bits bleiben unverändert.
Secrets.flipBits(0b1100, 0b0101);
# => 0b1001
Zuletzt gibt es außerdem bestimmte Bits, die immer zu 0 entschlüsselt werden.
Implementiere die Methode Secrets.clearBits, die einen Wert und eine Maske entgegennimmt.
Die Bits im value sollten auf 0 gesetzt werden, wenn das Bit in der Maske 1 ist.
Alle anderen Bits bleiben unverändert.
Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
Melde dich bei Exercism an, um Java mit 26 Konzepte158 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.