Άρθρο #11: Λογικοί ανά-bit τελεστές / Bitwise operators - Τελεστές ολίσθησης

Επισκόπηση προηγούμενης Θ.Ενότητας Επισκόπηση επόμενης Θ.Ενότητας Πήγαινε κάτω

Άρθρο #11: Λογικοί ανά-bit τελεστές / Bitwise operators - Τελεστές ολίσθησης

Δημοσίευση από GReaper Την / Το Σαβ Σεπ 22, 2012 3:41 pm

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

Λογικό 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 ) Very Happy

Λοιπόν, οι λογικοί "ανα-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 και ο αριθμός [u]δεν είναι[/u] unsigned, τότε δεν ξέρουμε πιο απ' αυτά τα αποτελέσματα θα βγει επειδή κάθε μεταγλωττιστής μπορεί να το κατασκευάσει όπως θέλει. Αλλά σε οποιαδήποτε άλλη περίπτωση, ισχύει πάντα το πρώτο αποτέλεσμα )
να θυμάστε ότι τα bits που βγαίνουν έξω απ' τη χωρητικότητα του αριθμού χάνονται, ότι τα καινούργια bits είναι πάντα μηδέν εκτός από τη περίπτωση που ανέφερα, και ότι όλοι οι τελεστές που αναφέρθηκαν σ' αυτό το άρθρο μπορούν να χρησιμοποιηθούν μόνο με ακέραιους! ( Αν προσπαθήσετε να κάνετε πράξεις με πραγματικούς θα σας βγάλει λάθη )

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

Αριθμός μηνυμάτων : 16
Ημερομηνία εγγραφής : 01/10/2011
Ηλικία : 25
Τόπος : Σπάρτη

http://procorn.forumgreek.com

Επιστροφή στην κορυφή Πήγαινε κάτω

Επισκόπηση προηγούμενης Θ.Ενότητας Επισκόπηση επόμενης Θ.Ενότητας Επιστροφή στην κορυφή


 
Δικαιώματα σας στην κατηγορία αυτή
Δεν μπορείτε να απαντήσετε στα Θέματα αυτής της Δ.Συζήτησης