Crystal hat Bitoperatoren, mit denen du Int auf der binären Ebene bearbeiten kannst.
Crystal hat Schiebeoperatoren, mit denen du Bits nach links (<<) oder nach rechts (>>) verschieben kannst.
<<)Der Linksschiebeoperator (<<) verschiebt die Bits nach links.
Der zu verschiebende Wert steht links und die Anzahl der Stellen, um die verschoben wird, steht rechts.
0b0010 << 1
# => 0b0100
0b0010 << 2
# => 0b1000
Wenn die Zahl negativ ist, verschiebt er stattdessen nach rechts.
0b0010 << -1
# => 0b0001
>>)Der Rechtsschiebeoperator (>>) verschiebt die Bits nach rechts.
Wie beim Linksschiebeoperator steht der zu verschiebende Wert links und die Anzahl der Stellen, um die verschoben wird, rechts.
0b0100 >> 1
# => 0b0010
0b0100 >> 2
# => 0b0001
Und genauso verschiebt der Operator nach links, wenn die Zahl negativ ist.
0b0100 >> -1
# => 0b1000
Crystal hat 3 binäre Operatoren (&, |, ^) und einen ~-Operator für bitweise Operationen.
&)Der binäre UND-Operator (&) führt ein bitweises UND mit zwei Werten aus.
Er vergleicht jedes Bit im ersten Wert mit dem Bit an derselben Position im zweiten Wert.
Das resultierende Bit wird auf 1 gesetzt, wenn beide Bits 1 sind.
Andernfalls wird es auf 0 gesetzt.
0b0011 & 0b1010
# => 0b0010
|)Der binäre ODER-Operator (|) führt ein bitweises ODER mit zwei Werten aus.
Auch er vergleicht jedes Bit im ersten Wert mit dem Bit an derselben Position im zweiten Wert.
Wenn eines der beiden Bits 1 ist, wird das resultierende Bit auf 1 gesetzt.
Andernfalls wird es auf 0 gesetzt.
0b0011 | 0b1010
# => 0b1011
^)Der binäre XOR-Operator (^) führt ein bitweises XOR 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.
Wenn nur eines von ihnen 1 ist, ist das resultierende Bit 1.
Andernfalls ist es 0.
0b0011 ^ 0b1010
# => 0b1001
~)Zuletzt kehrt der bitweise NICHT-Operator (~) jedes Bit des Werts um.
Anders als die anderen binären Operatoren ist dies ein unärer Operator, der nur auf den Wert rechts von ihm wirkt.
~0b1110_0010
# => 0b0001_1101
Dein Freund hat dir gerade eine Nachricht mit einem wichtigen Geheimnis geschickt. Damit es andere nicht leicht haben, sie zu lesen, wurde die Nachricht mit einer Reihe von Bitmanipulationen verschlüsselt. Du musst ein Programm schreiben, das dir hilft, die Nachricht zu entschlüsseln.
Der erste Schritt beim Entschlüsseln der Nachricht besteht darin, die Verschiebung aus dem Verschlüsselungsprozess rückgängig zu machen, indem die Bits wieder nach links verschoben werden. Die Anzahl der Stellen, um die verschoben wird, kann von Nachricht zu Nachricht variieren.
Implementiere die Methode Secrets.shift_back, die einen Wert und die Anzahl der Stellen für die Verschiebung nach links entgegennimmt.
Secrets.shift_back(0b0001, 2)
# => 0b0100
Der nächste Schritt ist, eine Bitmaske anzuwenden, um den Wert bestimmter Bits herauszulesen. Die Maske wird angewendet, indem ein bitweises UND zwischen dem Wert und der Maske durchgeführt wird.
Implementiere die Methode Secrets.apply_mask, die einen Wert entgegennimmt und eine Maske anwendet.
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
Das Verschieben der Bits nach links hat einige neue 0-Bits hinzugefügt. Einige dieser neuen Bits müssen auf 1 gesetzt werden. Das bitweise ODER ist nützlich, um bestimmte Bits auf 1 zu setzen und die übrigen beizubehalten.
Implementiere die Methode Secrets.set_bits, die zwei Werte entgegennimmt und ein bitweises ODER durchführt.
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
Ein Teil des Verschlüsselungsprozesses wendet ein XOR mit einem vereinbarten Wert an. Um zum ursprünglichen Wert zurückzukommen, kann der verschlüsselte Wert einfach erneut mit dem vereinbarten Wert XOR-verknüpft werden. Aufgrund eines Missverständnisses hat dein Freund jedoch die Bits des vereinbarten Werts umgedreht (d. h. ein bitweises NICHT auf den vereinbarten Wert angewendet), bevor er das XOR angewendet hat.
Implementiere die Methode Secrets.reverse_xor, die den verschlüsselten und den vereinbarten Wert entgegennimmt und den ursprünglichen Wert berechnet.
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Melde dich bei Exercism an, um Crystal mit 26 Konzepte142 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.