Περιγραφή

Υπάρχουν δύο τελεστές μετακίνησης των bits στην γλώσσα C++ : ο αριστερός τελεστής μετακίνησης << και ο δεξιός τελεστής μετακίνησης >>. Αυτοί οι τελεστές αναγκάζουν τα bits που βρίσκονται αριστερά του τελεστή να μετατοπιστούν είτε αριστερά είτε δεξιά, σύμφωνα με τον αριθμό των θέσεων που καθορίζονται από την δεξιά πλευρά του τελεστή.

Σύνταξη

μεταβλητή << αριθμός των bits

μεταβλητή >> αριθμός των bits

Παράμετροι

μεταβλητή : (byte, int, long) αριθμός των bits ακέραιος <= 32

Παράδειγμα

    int a = 5;        // binary: 0000000000000101
    int b = a << 3; // binary: 0000000000101000, or 40 in decimal int c = b >> 3;   // binary: 0000000000000101, or back to 5 like we started with

Όταν μετακινείτε μια τιμή του x με bits του y, δηλαδή (x << y), τότε τα αριστερότερα bits του y στον x χάνονται. Ουσιαστικά έχουν μετατοπιστεί και άλλο αριστερά και δεν φαίνονται:

    int a = 5;        // binary: 0000000000000101
    int b = a << 14;  // binary: 0100000000000000 - the first 1 in 101 was discarded

Εάν είστε βέβαιοι ότι κανένα από αυτά δεν συμβαίνει σε μια τιμή που έχει οδηγηθεί στη λήθη, τότε ένας εύκολος τρόπος για να σκεφτούμε την λειτουργία του τελεστή της αριστερής μετατόπισης είναι ότι πολλαπλασιάζει τον αριστερό τελεστή υψωμένο στο 2 με τη δύναμη του δεξιού τελεστή. Για παράδειγμα, για να δημιουργήσετε τις δυνάμεις του 2, μπορείτε να χρησιμοποιήσετε τις ακόλουθες εκφράσεις:

    1 <<  0  ==    1
    1 <<  1  ==    2
    1 <<  2  ==    4
    1 <<  3  ==    8
    ...
    1 <<  8  ==  256
    1 <<  9  ==  512
    1 << 10  == 1024
    ...

Όταν μετακινείτε δεξιά το x κατά y bits (x >> y) και το υψηλότερο bit στον x είναι το 1, τότε το αποτέλεσμα εξαρτάται από τον ακριβή τύπο δεδομένων του x. Εάν ο τύπος του x είναι ακέραιος, τότε το υψηλότερο bit είναι το bit συμβολισμού (MSB) καθορίζοντας εάν το x είναι αρνητικό ή όχι, όπως έχουμε αναφέρει παραπάνω. Σε αυτή την περίπτωση, το bit συμβολισμού (MSB) αντιγράφεται στα χαμηλότερα τάξης bits για απόρρητους ιστορικούς λόγους:

    int x = -16;     // binary: 1111111111110000
    int y = x >> 3;  // binary: 1111111111111110

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

    int x = -16;                   // binary: 1111111111110000
    int y = (unsigned int)x >> 3;  // binary: 0001111111111110

Εάν είστε προσεκτικοί και θέλετε να αποφύγετε την επέκταση προσήμου, τότε μια λύση είναι να χρησιμοποιήσετε τον τελεστή δεξιάς μετατόπισης >> για τις διαδοχικές διαιρέσεις των δυνάμεων του 2. Για παράδειγμα:

    int x = 1000;
    int y = x >> 3;   // integer division of 1000 by 8, causing y = 125.

Επιστροφή στην σελίδα Παραπομπές Γλώσσας