Η C είναι απλή/Λογικοί ανά-bit τελεστές / Bitwise operators - Τελεστές ολίσθησης

Πρώτα απ' όλα, ας κάνω μια ανακεφαλαίωση για τις λογικές πράξεις, προσθέτοντας μια στην οποία δεν προαναφέρθηκα:

Λογικό AND ( a && b)

a b result
0 0  0
0 1  0
1 0  0
1 1  1

Λογικό OR ( a || b)

a b result
0 0  0
0 1  1
1 0  1
1 1  1

Λογικό NOT ( !a )

a result
0  1
1  0

Λογικό XOR ( δεν υπάρχει τελεστής στην C )

a b result
0 0  0
0 1  1
1 0  1
1 1  0

( a XOR b = !a && b || a && !b ) :D

Λοιπόν, οι λογικοί "ανα-bit" τελεστές κάνουν ότι και οι απλοί, αλλά για κάθε bit τους αριθμού ξεχωριστά! Με λίγα λόγια, βλέπουν τις μεταβλητές σαν πίνακες από bit, κάνουν την αντίστοιχη πράξη σε ένα-ένα bit και αποθηκεύουν το αποτέλεσμα στην αντίστοιχη θέση του καινούργιου αριθμού, πχ:

a = 10, b = 9
c = a bitwise_and b = 8, γιατί?
a = 1010(2)
b = 1001(2)
c = 1000(2) = 8

οι τελεστές της C για αυτές τις πράξεις είναι BIT_AND( & ) BIT_OR( | ) BIT_NOT( ~ ) BIT_XOR( ^ ). Παρεμπιπτόντως, ο τίτλος του θέματος είναι παραπλανητικός, επειδή στη πραγματικότητα αντιμετωπίζονται ως αριθμητικοί τελεστές!

Τέλος, υπάρχουν οι τελεστές ολίσθησης / shift operators, οι οποίοι "σπρώχνουν" τα bits ενός αριθμού κάποιες θέσεις αριστερά ή δεξιά. Τα σύμβολά τους είναι << για αριστερά και >> για δεξιά. Πχ:

001011(2) << 2 : δύο θέσεις αριστερά
101100(2)
1011(2) >> 1 : μια θέση δεξιά
0101(2) ή 1101(2) ( Αν το ποιο σημαντικό bit είναι 1 και ο αριθμός δεν είναι unsigned, τότε δεν ξέρουμε πιο απ' αυτά τα αποτελέσματα θα βγει επειδή κάθε μεταγλωττιστής μπορεί να το κατασκευάσει όπως θέλει. Αλλά σε οποιαδήποτε άλλη περίπτωση, ισχύει πάντα το πρώτο αποτέλεσμα )

να θυμάστε ότι τα bits που βγαίνουν έξω απ' τη χωρητικότητα του αριθμού χάνονται, ότι τα καινούργια bits είναι πάντα μηδέν εκτός από τη περίπτωση που ανέφερα, και ότι όλοι οι τελεστές που αναφέρθηκαν σ' αυτό το άρθρο μπορούν να χρησιμοποιηθούν μόνο με ακέραιους! ( Αν προσπαθήσετε να κάνετε πράξεις με πραγματικούς θα σας βγάλει λάθη )

Μια ενδιαφέρουσα ιδιότητα της ολίσθησης είναι ότι για κάθε ολίσθηση προς τα αριστερά κατά ένα, είναι σαν να πολλαπλασιάζεις με το δύο, και προς τα δεξιά κατά ένα είναι σαν να διαιρείς με το δύο.