Η Java διαθέτει τελεστές για τον χειρισμό των bit ενός byte, short, int, long ή char.
Χρησιμοποίησε τον << για ολίσθηση των bit προς τα αριστερά και τον >> για ολίσθηση προς τα δεξιά.
// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100
// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010
Ο τελεστής << εισάγει πάντα μηδενικά στη δεξιά πλευρά.
Ωστόσο, ο >> εισάγει το ίδιο bit με το πιο αριστερό bit (1 αν ο αριθμός είναι αρνητικός ή 0 αν είναι θετικός).
// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;
// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001
Χρησιμοποίησε τον >>> αντ' αυτού όταν κατά την ολίσθηση προς τα δεξιά πρέπει να εισαχθούν μηδενικά.
// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001
Ο τελεστής AND κατά bit (&) παίρνει δύο τιμές και εκτελεί AND σε κάθε bit.
Συγκρίνει κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής.
Αν είναι και τα δύο 1, τότε το bit του αποτελέσματος είναι 1.
Διαφορετικά, το bit του αποτελέσματος είναι 0.
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
Ο τελεστής OR κατά bit (|) παίρνει δύο τιμές και εκτελεί OR σε κάθε bit.
Συγκρίνει κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής.
Αν οποιοδήποτε από τα δύο bit είναι 1, το bit του αποτελέσματος είναι 1.
Διαφορετικά, είναι 0.
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
Ο τελεστής XOR κατά bit (^) εκτελεί XOR κατά bit σε δύο τιμές.
Όπως οι τελεστές AND και OR κατά bit, συγκρίνει κάθε bit της πρώτης τιμής με το bit στην ίδια θέση της δεύτερης τιμής.
Αν μόνο ένα από τα δύο είναι 1, το bit του αποτελέσματος είναι 1.
Διαφορετικά, είναι 0.
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)Τέλος, ο τελεστής NOT κατά bit (~) αντιστρέφει κάθε bit.
Σε αντίθεση με τους προηγούμενους τελεστές, αυτός είναι μονομελής τελεστής και δρα μόνο σε μία τιμή.
~0b0110_0101;
// # => 0b1001_1010
Ο φίλος σου μόλις σου έστειλε ένα μήνυμα με ένα σημαντικό μυστικό. Επειδή δεν ήθελε να είναι εύκολο για τους άλλους να το διαβάσουν, το μήνυμα κρυπτογραφήθηκε με μια σειρά από χειρισμούς bits. Θα χρειαστεί να γράψεις τις μεθόδους που θα βοηθήσουν στην αποκρυπτογράφηση του μηνύματος.
Το πρώτο βήμα για την αποκρυπτογράφηση του μηνύματος είναι να αναιρέσεις την ολίσθηση που έγινε κατά την κρυπτογράφηση, ολισθαίνοντας τα bits ξανά προς τα δεξιά. Θα ακολουθήσουν κι άλλα βήματα στη διαδικασία αποκρυπτογράφησης που υποθέτουν ότι από την αριστερή πλευρά εισάγονται 0.
Υλοποίησε τη μέθοδο Secrets.shiftBack, η οποία παίρνει μια τιμή και τον αριθμό των θέσεων ολίσθησης και εκτελεί την ολίσθηση.
Secrets.shiftBack(0b1001, 2);
# => 0b0010
Στη συνέχεια, υπάρχουν κάποια bits που πρέπει να τεθούν σε 1.
Υλοποίησε τη μέθοδο Secrets.setBits, η οποία παίρνει μια τιμή και μια μάσκα και επιστρέφει το αποτέλεσμα της θέσης των bits της τιμής σε 1.
Ένα bit της τιμής πρέπει να τεθεί σε 1 όπου και το αντίστοιχο bit της μάσκας είναι 1.
Όλα τα άλλα bits πρέπει να παραμείνουν αμετάβλητα.
Secrets.setBits(0b0110, 0b0101);
# => 0b0111
Κάποια bits αντιστρέφονται κατά την κρυπτογράφηση. Θα χρειαστεί να αντιστραφούν ξανά για να αποκρυπτογραφηθεί το μήνυμα.
Υλοποίησε τη μέθοδο Secrets.flipBits, η οποία παίρνει μια τιμή και τη μάσκα.
Η μάσκα δείχνει ποια bits της τιμής θα αντιστραφούν.
Αν το bit στη μάσκα είναι 1, το bit αντιστρέφεται στην τιμή.
Όλα τα άλλα bits παραμένουν αμετάβλητα.
Secrets.flipBits(0b1100, 0b0101);
# => 0b1001
Τέλος, υπάρχουν και κάποια bits που αποκρυπτογραφούνται πάντα σε 0.
Υλοποίησε τη μέθοδο Secrets.clearBits, η οποία παίρνει μια τιμή και μια μάσκα.
Τα bits της value πρέπει να τεθούν σε 0 όπου το bit της μάσκας είναι 1.
Όλα τα άλλα bits πρέπει να παραμείνουν αμετάβλητα.
Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Java με 26 έννοιες158 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.