Μυστικά

Μυστικά

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

Εισαγωγή

Πράξεις bitwise

Οι πράξεις bitwise μάς επιτρέπουν να επεξεργαζόμαστε μεμονωμένα ψηφία μέσα σε δυαδικούς αριθμούς.

Η Elm παρέχει αρκετούς τελεστές bitwise στο άρθρωμα Bitwise

Βασικές πράξεις

Η τροποποίηση μεμονωμένων bit ενός αριθμού ονομάζεται κάλυψη. Μια μάσκα είναι ένας αριθμός όπου συγκεκριμένα bit έχουν τεθεί με έναν ιδιαίτερο τρόπο, ώστε να τροποποιήσουν έναν άλλο αριθμό χρησιμοποιώντας τελεστές bitwise όπως οι and, or και xor.

and

Ο and συνδυάζει δύο αριθμούς κρατώντας μόνο τα bit που είναι 1 και στους δύο. Αυτό είναι χρήσιμο για να ελέγξεις αν ένα μεμονωμένο bit έχει τεθεί. Για παράδειγμα, για να ελέγξεις αν το 4ο bit ενός αριθμού έχει τεθεί σε 1, κάνε and με μια μάσκα 01000 (8 στο δεκαδικό σύστημα) και δες αν το αποτέλεσμα είναι μη μηδενικό:

Bitwise.and 13 8 --> 8
--  13 = 01101
--   8 = 01000
-- and = 01000 = 8
or

Ο or συνδυάζει δύο αριθμούς θέτοντας κάθε bit σε 1 αν είναι 1 στον έναν ή και στους δύο αριθμούς. Αυτό είναι χρήσιμο για να θέσεις ένα συγκεκριμένο bit σε 1. Για παράδειγμα, για να θέσεις το 2ο bit στο 10101 σε 1, κάνε or με τη μάσκα 00010:

Bitwise.or 21 2 --> 23
-- 21 = 10101
--  2 = 00010
-- or = 10111 = 23
Αποκλειστικό ή (xor)

Ο xor συνδυάζει δύο αριθμούς θέτοντας κάθε bit σε 1 αν είναι 1 στον έναν αριθμό αλλά 0 στον άλλο. Αυτό είναι χρήσιμο για να αντιστρέψεις ένα bit στην αντίθετη τιμή του:

Bitwise.xor 20 5 --> 17
--  20 = 10100
--   5 = 00101
-- xor = 10001 = 17
Συμπλήρωμα

Το complement αντιστρέφει κάθε bit ενός αριθμού (0 γίνεται 1, 1 γίνεται 0).

Σημείωσε ότι έτσι οι θετικοί αριθμοί γίνονται αρνητικοί και οι αρνητικοί γίνονται θετικοί. Αυτό συμβαίνει επειδή οι αρνητικοί αριθμοί στο δυαδικό σύστημα παριστάνονται με 1 στο αριστερότερο ψηφίο.

Bitwise.complement 21 --> -22
--         21 = 00000000000000000000000000010101
-- complement = 11111111111111111111111111101010 = -22
Μετατόπιση bit

Οι παρακάτω τελεστές μετακινούν τα bit αριστερά ή δεξιά κατά έναν καθορισμένο αριθμό θέσεων, πολλαπλασιάζοντας ή διαιρώντας ουσιαστικά με δυνάμεις του 2.

Ο shiftLeftBy μετακινεί τα bit προς τα αριστερά, γεμίζοντας με 0 από τα δεξιά. Για παράδειγμα, για να μετακινήσεις το 21 αριστερά κατά 3 θέσεις:

Bitwise.shiftLeftBy 3 21 --> 168
--  21 = 10101
-- shiftLeftBy 3 = 10101000 = 168

Αυτό είναι το ίδιο με το να πεις 21 * 2^3 = 21 * 2 * 2 * 2 = 168

shiftRightBy: Μετακινεί τα bit προς τα δεξιά:

Bitwise.shiftRightBy 2 21 --> 5
--  21 = 10101
-- shiftRightBy 2 = 00101 = 5

Η μετατόπιση δεξιά κατά 2 θέσεις είναι το ίδιο με ακέραια διαίρεση με το 4.

Σημείωσε ότι αυτή η συνάρτηση αντιγράφει όποια τιμή βρίσκεται στο αριστερότερο bit. Έτσι, οι αρνητικοί αριθμοί παραμένουν αρνητικοί:

Bitwise.shiftRightBy 3 -21 --> -3
--  -21 = 111...101011
-- shiftRightBy 3 = 111...11101 = -3

Αν θέλεις να μετατοπίσεις δεξιά και να γεμίσεις με μηδενικά, χρησιμοποίησε το shiftRightZfBy:

Bitwise.shiftRightZfBy 3 -21 --> 536870909
--  -21 = 111...101011
-- shiftRightZfBy 3 = 00111...11101 = 536870909

Οδηγίες

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

1. Μετατόπισε τα bit προς τα πίσω

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

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

shiftBack 2 42 --> 10

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

Έπειτα, υπάρχουν κάποια bit που πρέπει να τεθούν σε 1.

Υλοποίησε τη συνάρτηση setBits που παίρνει μια μάσκα και μια τιμή και επιστρέφει το αποτέλεσμα της θέσης των bit της τιμής σε 1. Ένα bit της τιμής πρέπει να τεθεί σε 1 όπου το bit στη μάσκα είναι επίσης 1. Όλα τα άλλα bit πρέπει να μείνουν αμετάβλητα.

setBits 66 212 --> 64

3. Αντιστρέψε συγκεκριμένα bit

Κάποια bit αντιστρέφονται κατά την κρυπτογράφηση. Θα πρέπει να αντιστραφούν ξανά για να αποκρυπτογραφηθεί το μήνυμα.

Υλοποίησε τη συνάρτηση flipBits που παίρνει μια μάσκα και μια τιμή. Η μάσκα δείχνει ποια bit της τιμής θα αντιστραφούν. Αν το bit στη μάσκα είναι 1, το bit αντιστρέφεται στην τιμή. Όλα τα άλλα bit μένουν αμετάβλητα.

flipBits 23 157 --> 138

4. Μηδένισε συγκεκριμένα bit

Υπάρχουν επίσης κάποια bit που αποκρυπτογραφούνται πάντα σε 0.

Υλοποίησε τη συνάρτηση clearBits που παίρνει μια μάσκα και μια τιμή. Τα bit του value πρέπει να τεθούν σε 0 όπου το bit στη μάσκα είναι 1. Όλα τα άλλα bit πρέπει να μείνουν αμετάβλητα.

clearBits 2 15 --> 13

5. Αποκρυπτογράφησε ένα μήνυμα

Τώρα που έχεις όλες τις συναρτήσεις που χρειάζεσαι, μπορείς να αποκωδικοποιήσεις το μήνυμα του φίλου σου. Υλοποίησε τη συνάρτηση decrypt που εκτελεί τις εξής πράξεις:

  1. Θέσε τα bit από το έτος γέννησης του φίλου σου (1996)
  2. Αντιστρέψε το αποτέλεσμα με το έτος που γνωριστήκατε για πρώτη φορά (2009)
  3. Μετατόπισε τα bit προς τα πίσω κατά τον αριθμό των μαθημάτων που παρακολουθείτε μαζί (5)
  4. Μηδένισε το πρώτο και το πέμπτο bit.
decrypt 380182 --> 11840

Υλοποίησε τη συνάρτηση decrypt με όλες τις συναρτήσεις που υλοποίησες στις προηγούμενες εργασίες.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Elm Exercism

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

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