Μυστικά

Μυστικά

Άσκηση εκμάθησης

Εισαγωγή

Η Crystal διαθέτει bitwise τελεστές για τον χειρισμό του Int σε δυαδικό επίπεδο.

Τελεστές μετατόπισης

Η Crystal διαθέτει τελεστές μετατόπισης για τη μετατόπιση bit προς τα αριστερά (<<) ή προς τα δεξιά (>>).

Μετατόπιση αριστερά (<<)

Ο τελεστής μετατόπισης αριστερά (<<) μετατοπίζει τα bit προς τα αριστερά. Η τιμή που θα μετατοπιστεί δίνεται στα αριστερά και ο αριθμός των θέσεων μετατόπισης στα δεξιά.

0b0010 << 1
# => 0b0100

0b0010 << 2
# => 0b1000

Αν ο αριθμός είναι αρνητικός, η μετατόπιση γίνεται προς τα δεξιά.

0b0010 << -1
# => 0b0001

Μετατόπιση δεξιά (>>)

Ο τελεστής μετατόπισης δεξιά (>>) μετατοπίζει τα bit προς τα δεξιά. Όπως και ο τελεστής μετατόπισης αριστερά, η τιμή που θα μετατοπιστεί δίνεται στα αριστερά και ο αριθμός των θέσεων μετατόπισης στα δεξιά.

0b0100 >> 1
# => 0b0010

0b0100 >> 2
# => 0b0001

Και αντίστοιχα, αν ο αριθμός είναι αρνητικός, ο τελεστής μετατοπίζει προς τα αριστερά.

0b0100 >> -1
# => 0b1000

Δυαδικοί τελεστές

Η Crystal διαθέτει 3 δυαδικούς τελεστές (&, |, ^) και έναν τελεστή ~ για την εκτέλεση bitwise πράξεων.

Bitwise AND (&)

Ο δυαδικός τελεστής AND (&) εκτελεί μια bitwise πράξη AND σε δύο τιμές. Συγκρίνει κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής. Το bit που προκύπτει γίνεται 1 αν και τα δύο bit είναι 1. Σε διαφορετική περίπτωση, γίνεται 0.

0b0011 & 0b1010
# => 0b0010

Bitwise OR (|)

Ο δυαδικός τελεστής OR (|) εκτελεί μια bitwise πράξη OR σε δύο τιμές. Συγκρίνει επίσης κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής. Αν ένα από τα δύο bit είναι 1, το bit που προκύπτει γίνεται 1. Σε διαφορετική περίπτωση, γίνεται 0.

0b0011 | 0b1010
# => 0b1011

Bitwise XOR (^)

Ο δυαδικός τελεστής XOR (^) εκτελεί μια bitwise πράξη XOR. Όπως και οι τελεστές bitwise AND και bitwise OR, συγκρίνει κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής. Αν μόνο ένα από αυτά είναι 1, το bit που προκύπτει είναι 1. Σε διαφορετική περίπτωση, είναι 0.

0b0011 ^ 0b1010
# => 0b1001

Bitwise NOT (~)

Τέλος, ο bitwise τελεστής NOT (~) αντιστρέφει κάθε bit της τιμής. Σε αντίθεση με τους άλλους δυαδικούς τελεστές, αυτός είναι μονομελής τελεστής και δρα μόνο στην τιμή στα δεξιά.

~0b1110_0010
# => 0b0001_1101

Οδηγίες

Ο φίλος σου μόλις σου έστειλε ένα μήνυμα με ένα σημαντικό μυστικό. Επειδή δεν ήθελε να το διαβάζουν εύκολα οι άλλοι, το μήνυμα έχει κρυπτογραφηθεί με μια σειρά από χειρισμούς bit. Θα χρειαστεί να γράψεις ένα πρόγραμμα που θα βοηθήσει στην αποκρυπτογράφηση του μηνύματος.

1. Κάνε ολίσθηση των bit πίσω

Το πρώτο βήμα για την αποκρυπτογράφηση του μηνύματος είναι να αναιρέσεις την ολίσθηση της κρυπτογράφησης, κάνοντας ολίσθηση των bit πίσω προς τα αριστερά. Ο αριθμός των θέσεων ολίσθησης μπορεί να διαφέρει από μήνυμα σε μήνυμα.

Υλοποίησε τη μέθοδο Secrets.shift_back που παίρνει μια τιμή και τον αριθμό των θέσεων για ολίσθηση προς τα αριστερά.

Secrets.shift_back(0b0001, 2)
# => 0b0100

2. Εφάρμοσε μια μάσκα bit

Το επόμενο βήμα είναι να εφαρμόσεις μια μάσκα bit για να εξαγάγεις την τιμή ορισμένων bit. Η μάσκα εφαρμόζεται εκτελώντας ένα bitwise AND ανάμεσα στην τιμή και τη μάσκα.

Υλοποίησε τη μέθοδο Secrets.apply_mask που παίρνει μια τιμή και εφαρμόζει μια μάσκα.

Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100

3. Θέσε κάποια bit

Η ολίσθηση των bit προς τα αριστερά πρόσθεσε κάποια νέα 0. Κάποια από αυτά τα νέα bit πρέπει να τεθούν σε 1. Το bitwise OR είναι χρήσιμο για να θέτεις συγκεκριμένα bit σε 1 διατηρώντας τα υπόλοιπα.

Υλοποίησε τη μέθοδο Secrets.set_bits που παίρνει δύο τιμές και εκτελεί ένα bitwise OR.

Secrets.set_bits(0b0110, 0b0101)
# => 0b111

4. Αντίστροφο XOR

Μέρος της διαδικασίας κρυπτογράφησης εφαρμόζει ένα XOR με μια συμφωνημένη τιμή. Για να επιστρέψεις στην αρχική τιμή, αρκεί να κάνεις ξανά XOR της κρυπτογραφημένης τιμής με τη συμφωνημένη τιμή. Ωστόσο, λόγω μιας παρεξήγησης, ο φίλος σου ανέστρεψε τα bit της συμφωνημένης τιμής (δηλαδή εφάρμοσε ένα bitwise NOT στη συμφωνημένη τιμή) πριν εφαρμόσει το XOR.

Υλοποίησε τη μέθοδο Secrets.reverse_xor που παίρνει την κρυπτογραφημένη και τη συμφωνημένη τιμή και υπολογίζει την αρχική τιμή.

Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Crystal Exercism

Έτοιμος να ξεκινήσεις την άσκηση Μυστικά;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.