Tracks
/
Crystal
Crystal
/
Übungen
/
Geheimnisse
Geheimnisse

Geheimnisse

Lernübung

Einführung

Crystal hat Bitoperatoren, mit denen du Int auf der binären Ebene bearbeiten kannst.

Schiebeoperatoren

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

Nach rechts schieben (>>)

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

Binäre Operatoren

Crystal hat 3 binäre Operatoren (&, |, ^) und einen ~-Operator für bitweise Operationen.

Bitweises UND (&)

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

Bitweises ODER (|)

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

Bitweises XOR (^)

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

Bitweises NICHT (~)

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

Anleitung

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.

1. Die Bits zurückverschieben

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

2. Eine Bitmaske anwenden

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

3. Einige Bits setzen

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

4. XOR umkehren

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)
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Crystal Exercism

Bereit, mit Geheimnisse zu starten?

Melde dich bei Exercism an, um Crystal mit 26 Konzepte142 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.