Η 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 πράξεων.
&)Ο δυαδικός τελεστής AND (&) εκτελεί μια bitwise πράξη AND σε δύο τιμές.
Συγκρίνει κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής.
Το bit που προκύπτει γίνεται 1 αν και τα δύο bit είναι 1.
Σε διαφορετική περίπτωση, γίνεται 0.
0b0011 & 0b1010
# => 0b0010
|)Ο δυαδικός τελεστής OR (|) εκτελεί μια bitwise πράξη OR σε δύο τιμές.
Συγκρίνει επίσης κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής.
Αν ένα από τα δύο bit είναι 1, το bit που προκύπτει γίνεται 1.
Σε διαφορετική περίπτωση, γίνεται 0.
0b0011 | 0b1010
# => 0b1011
^)Ο δυαδικός τελεστής XOR (^) εκτελεί μια bitwise πράξη XOR.
Όπως και οι τελεστές bitwise AND και bitwise OR, συγκρίνει κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής.
Αν μόνο ένα από αυτά είναι 1, το bit που προκύπτει είναι 1.
Σε διαφορετική περίπτωση, είναι 0.
0b0011 ^ 0b1010
# => 0b1001
~)Τέλος, ο bitwise τελεστής NOT (~) αντιστρέφει κάθε bit της τιμής.
Σε αντίθεση με τους άλλους δυαδικούς τελεστές, αυτός είναι μονομελής τελεστής και δρα μόνο στην τιμή στα δεξιά.
~0b1110_0010
# => 0b0001_1101
Ο φίλος σου μόλις σου έστειλε ένα μήνυμα με ένα σημαντικό μυστικό. Επειδή δεν ήθελε να το διαβάζουν εύκολα οι άλλοι, το μήνυμα έχει κρυπτογραφηθεί με μια σειρά από χειρισμούς bit. Θα χρειαστεί να γράψεις ένα πρόγραμμα που θα βοηθήσει στην αποκρυπτογράφηση του μηνύματος.
Το πρώτο βήμα για την αποκρυπτογράφηση του μηνύματος είναι να αναιρέσεις την ολίσθηση της κρυπτογράφησης, κάνοντας ολίσθηση των bit πίσω προς τα αριστερά. Ο αριθμός των θέσεων ολίσθησης μπορεί να διαφέρει από μήνυμα σε μήνυμα.
Υλοποίησε τη μέθοδο Secrets.shift_back που παίρνει μια τιμή και τον αριθμό των θέσεων για ολίσθηση προς τα αριστερά.
Secrets.shift_back(0b0001, 2)
# => 0b0100
Το επόμενο βήμα είναι να εφαρμόσεις μια μάσκα bit για να εξαγάγεις την τιμή ορισμένων bit. Η μάσκα εφαρμόζεται εκτελώντας ένα bitwise AND ανάμεσα στην τιμή και τη μάσκα.
Υλοποίησε τη μέθοδο Secrets.apply_mask που παίρνει μια τιμή και εφαρμόζει μια μάσκα.
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
Η ολίσθηση των bit προς τα αριστερά πρόσθεσε κάποια νέα 0. Κάποια από αυτά τα νέα bit πρέπει να τεθούν σε 1. Το bitwise OR είναι χρήσιμο για να θέτεις συγκεκριμένα bit σε 1 διατηρώντας τα υπόλοιπα.
Υλοποίησε τη μέθοδο Secrets.set_bits που παίρνει δύο τιμές και εκτελεί ένα bitwise OR.
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
Μέρος της διαδικασίας κρυπτογράφησης εφαρμόζει ένα XOR με μια συμφωνημένη τιμή. Για να επιστρέψεις στην αρχική τιμή, αρκεί να κάνεις ξανά XOR της κρυπτογραφημένης τιμής με τη συμφωνημένη τιμή. Ωστόσο, λόγω μιας παρεξήγησης, ο φίλος σου ανέστρεψε τα bit της συμφωνημένης τιμής (δηλαδή εφάρμοσε ένα bitwise NOT στη συμφωνημένη τιμή) πριν εφαρμόσει το XOR.
Υλοποίησε τη μέθοδο Secrets.reverse_xor που παίρνει την κρυπτογραφημένη και τη συμφωνημένη τιμή και υπολογίζει την αρχική τιμή.
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.