Οι πράξεις bitwise μάς επιτρέπουν να επεξεργαζόμαστε μεμονωμένα ψηφία μέσα σε δυαδικούς αριθμούς.
Η Elm παρέχει αρκετούς τελεστές bitwise στο άρθρωμα Bitwise
Η τροποποίηση μεμονωμένων bit ενός αριθμού ονομάζεται κάλυψη.
Μια μάσκα είναι ένας αριθμός όπου συγκεκριμένα bit έχουν τεθεί με έναν ιδιαίτερο τρόπο, ώστε να τροποποιήσουν έναν άλλο αριθμό χρησιμοποιώντας τελεστές bitwise όπως οι and, or και xor.
Ο and συνδυάζει δύο αριθμούς κρατώντας μόνο τα bit που είναι 1 και στους δύο.
Αυτό είναι χρήσιμο για να ελέγξεις αν ένα μεμονωμένο bit έχει τεθεί.
Για παράδειγμα, για να ελέγξεις αν το 4ο bit ενός αριθμού έχει τεθεί σε 1, κάνε and με μια μάσκα 01000 (8 στο δεκαδικό σύστημα) και δες αν το αποτέλεσμα είναι μη μηδενικό:
Bitwise.and 13 8 --> 8
-- 13 = 01101
-- 8 = 01000
-- and = 01000 = 8
Ο 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 συνδυάζει δύο αριθμούς θέτοντας κάθε 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 αριστερά ή δεξιά κατά έναν καθορισμένο αριθμό θέσεων, πολλαπλασιάζοντας ή διαιρώντας ουσιαστικά με δυνάμεις του 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. Θα χρειαστεί να γράψεις τις συναρτήσεις που θα βοηθήσουν στην αποκρυπτογράφηση του μηνύματος.
Το πρώτο βήμα για την αποκρυπτογράφηση του μηνύματος είναι να αναιρέσεις τη μετατόπιση της κρυπτογράφησης, μετατοπίζοντας τα bit πίσω προς τα δεξιά.
Στη συνέχεια της διαδικασίας αποκρυπτογράφησης υπάρχουν βήματα που υποθέτουν ότι τα 0 εισάγονται από την αριστερή πλευρά.
Υλοποίησε τη συνάρτηση shiftBack που παίρνει έναν αριθμό θέσεων μετατόπισης και μια τιμή και εκτελεί τη μετατόπιση.
shiftBack 2 42 --> 10
Έπειτα, υπάρχουν κάποια bit που πρέπει να τεθούν σε 1.
Υλοποίησε τη συνάρτηση setBits που παίρνει μια μάσκα και μια τιμή και επιστρέφει το αποτέλεσμα της θέσης των bit της τιμής σε 1.
Ένα bit της τιμής πρέπει να τεθεί σε 1 όπου το bit στη μάσκα είναι επίσης 1.
Όλα τα άλλα bit πρέπει να μείνουν αμετάβλητα.
setBits 66 212 --> 64
Κάποια bit αντιστρέφονται κατά την κρυπτογράφηση. Θα πρέπει να αντιστραφούν ξανά για να αποκρυπτογραφηθεί το μήνυμα.
Υλοποίησε τη συνάρτηση flipBits που παίρνει μια μάσκα και μια τιμή.
Η μάσκα δείχνει ποια bit της τιμής θα αντιστραφούν.
Αν το bit στη μάσκα είναι 1, το bit αντιστρέφεται στην τιμή.
Όλα τα άλλα bit μένουν αμετάβλητα.
flipBits 23 157 --> 138
Υπάρχουν επίσης κάποια bit που αποκρυπτογραφούνται πάντα σε 0.
Υλοποίησε τη συνάρτηση clearBits που παίρνει μια μάσκα και μια τιμή.
Τα bit του value πρέπει να τεθούν σε 0 όπου το bit στη μάσκα είναι 1.
Όλα τα άλλα bit πρέπει να μείνουν αμετάβλητα.
clearBits 2 15 --> 13
Τώρα που έχεις όλες τις συναρτήσεις που χρειάζεσαι, μπορείς να αποκωδικοποιήσεις το μήνυμα του φίλου σου.
Υλοποίησε τη συνάρτηση decrypt που εκτελεί τις εξής πράξεις:
decrypt 380182 --> 11840
Υλοποίησε τη συνάρτηση decrypt με όλες τις συναρτήσεις που υλοποίησες στις προηγούμενες εργασίες.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elm με 28 έννοιες110 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.