Bitwise OperaTors σε C: AND, OR, XOR, Shift & Συμπλήρωμα
⚡ Έξυπνη Σύνοψη
Οι τελεστές bitwise στη C χειρίζονται δεδομένα σε επίπεδο μεμονωμένων bit, χρησιμοποιώντας λειτουργίες AND, OR, XOR, συμπλήρωμα και μετατόπιση σε ακέραιους τελεστές για την εκτέλεση ταχύτερων υπολογισμών, τη συσκευασία σημαιών και τον έλεγχο υλικού σε προγραμματισμό χαμηλού επιπέδου και ενσωματωμένο.

Τι είναι το Bitwise Operators;
Bitwise OperaΟι tors χρησιμοποιούνται για τον χειρισμό δεδομένων σε επίπεδο bit, που ονομάζεται επίσης προγραμματισμός σε επίπεδο bit. Η μέθοδος Bitwise λειτουργεί με ένα ή περισσότερα μοτίβα bit ή δυαδικούς αριθμούς στο επίπεδο των μεμονωμένων bit τους. Χρησιμοποιούνται σε αριθμητικούς υπολογισμούς για να κάνουν τη διαδικασία υπολογισμού πιο γρήγορη.
Ακολουθεί η λίστα των τελεστών bitwise που παρέχονται από τη γλώσσα προγραμματισμού «C»:
| OperaTor | Νόημα |
|---|---|
| & | Bitwise τελεστής ΚΑΙ |
| | | Χειριστής bitwise OR |
| ^ | Αποκλειστικός τελεστής OR κατά bitwise |
| ~ | Συμπλήρωμα Binary One OperaΤο tor είναι ένας μοναδικός τελεστής |
| << | Αριστερός χειριστής βάρδιας |
| >> | Δεξιός χειριστής βάρδιας |
Οι τελεστές bitwise δεν μπορούν να εφαρμοστούν απευθείας σε πρωτόγονους τύπους δεδομένων όπως float, double, κ.λπ. Να θυμάστε πάντα ένα πράγμα ότι οι τελεστές bitwise χρησιμοποιούνται κυρίως με ακέραιος τύπος δεδομένων λόγω της συμβατότητάς του.
Οι λογικοί τελεστές bitwise εργάζονται στα δεδομένα bit-bit, ξεκινώντας από το λιγότερο σημαντικό bit, δηλαδή το bit LSB που είναι το πιο δεξί bit, δουλεύοντας προς το MSB (Most Significant Bit) που είναι το πιο αριστερό bit.
Το αποτέλεσμα του υπολογισμού των bitwise λογικών τελεστών φαίνεται στον παρακάτω πίνακα.
| x | y | x & y | x | εκεί | x^y |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Bitwise ΚΑΙ
Αυτός είναι ένας από τους πιο συχνά χρησιμοποιούμενους λογικούς τελεστές bitwise. Αντιπροσωπεύεται από ένα μόνο σύμβολο (&). Δύο ακέραιες εκφράσεις είναι γραμμένες σε κάθε πλευρά του τελεστή (&).
Το αποτέλεσμα της λειτουργίας bitwise AND είναι 1 εάν και τα δύο bit έχουν την τιμή 1. Διαφορετικά, το αποτέλεσμα είναι πάντα 0.
Ας θεωρήσουμε ότι έχουμε 2 μεταβλητές op1 και op2 με τιμές ως εξής:
Op1 = 0000 1101 Op2 = 0001 1001
Το αποτέλεσμα της λειτουργίας AND στις μεταβλητές op1 και op2 θα είναι
Result = 0000 1001
Όπως μπορούμε να δούμε, δύο μεταβλητές συγκρίνονται κομμάτι προς bit. Όποτε η τιμή ενός bit και στις δύο μεταβλητές είναι 1, τότε το αποτέλεσμα θα είναι 1 ή αλλιώς 0.
Bitwise Ή
Αντιπροσωπεύεται από ένα ενιαίο σύμβολο κάθετης ράβδου (|). Δύο ακέραιες εκφράσεις είναι γραμμένες σε κάθε πλευρά του τελεστή (|).
Το αποτέλεσμα της λειτουργίας bitwise OR είναι 1 εάν τουλάχιστον μία από τις εκφράσεις έχει την τιμή 1. Διαφορετικά, το αποτέλεσμα είναι πάντα 0.
Ας θεωρήσουμε ότι έχουμε 2 μεταβλητές op1 και op2 με τιμές ως εξής:
Op1 = 0000 1101 Op2 = 0001 1001
Το αποτέλεσμα της λειτουργίας OR στις μεταβλητές op1 και op2 θα είναι
Result = 0001 1101
Όπως μπορούμε να δούμε, δύο μεταβλητές συγκρίνονται κομμάτι προς bit. Όποτε η τιμή ενός bit σε μια από τις μεταβλητές είναι 1, τότε το αποτέλεσμα θα είναι 1 ή αλλιώς 0.
Bitwise Exclusive OR
Αντιπροσωπεύεται από ένα σύμβολο (^). Δύο ακέραιες εκφράσεις είναι γραμμένες σε κάθε πλευρά του τελεστή (^).
Το αποτέλεσμα της λειτουργίας Exclusive-OR είναι 1 εάν μόνο μία από τις εκφράσεις έχει την τιμή 1. Διαφορετικά, το αποτέλεσμα είναι πάντα 0.
Ας θεωρήσουμε ότι έχουμε 2 μεταβλητές op1 και op2 με τιμές ως εξής:
Op1 = 0000 1101 Op2 = 0001 1001
Το αποτέλεσμα της λειτουργίας XOR στις μεταβλητές op1 και op2 θα είναι
Result = 0001 0100
Όπως μπορούμε να δούμε, δύο μεταβλητές συγκρίνονται κομμάτι προς bit. Όποτε μόνο μία μεταβλητή έχει την τιμή 1, τότε το αποτέλεσμα είναι 0, αλλιώς 0 θα είναι το αποτέλεσμα.
Ας γράψουμε ένα απλό πρόγραμμα που δείχνει λογικούς τελεστές bitwise.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int b = 21; /* 21 = 010101 */ int c = 0; c = a & b; /* 20 = 010100 */ printf("AND - Value of c is %d\n", c ); c = a | b; /* 21 = 010101 */ printf("OR - Value of c is %d\n", c ); c = a ^ b; /* 1 = 0001 */ printf("Exclusive-OR - Value of c is %d\n", c ); getch(); }
Παραγωγή:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
Τελεστές μετατόπισης bitwise
Οι τελεστές μετατόπισης bit χρησιμοποιούνται για τη μετακίνηση/μετατόπιση των μοτίβων bit είτε προς τα αριστερά είτε προς τα δεξιά. Αριστερά και δεξιά είναι δύο τελεστές μετατόπισης που παρέχονται από το 'C' και αναπαρίστανται ως εξής:
Operand << n (Left Shift) Operand >> n (Right Shift)
Εδώ,
- ένας τελεστής είναι μια ακέραια έκφραση στην οποία πρέπει να εκτελέσουμε τη λειτουργία shift.
- Το 'n' είναι ο συνολικός αριθμός των θέσεων bit που πρέπει να μετατοπίσουμε στην ακέραια παράσταση.
Η λειτουργία αριστερής μετατόπισης θα μετατοπίσει τον αριθμό «n» των bit στην αριστερή πλευρά. Τα πιο αριστερά bit στην παράσταση θα εμφανιστούν και n bit με την τιμή 0 θα συμπληρωθούν στη δεξιά πλευρά.
Η λειτουργία δεξιάς μετατόπισης θα μετατοπίσει τον αριθμό «n» των bit στη δεξιά πλευρά. Τα πιο δεξιά bit 'n' στην έκφραση θα εμφανιστούν και η τιμή 0 θα συμπληρωθεί στην αριστερή πλευρά.
Παράδειγμα: Το x είναι μια ακέραια παράσταση με δεδομένα 1111. Μετά την εκτέλεση της λειτουργίας shift το αποτέλεσμα θα είναι:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
ShiftΟι τελεστές s μπορούν να συνδυαστούν και στη συνέχεια μπορούν να χρησιμοποιηθούν για παράδειγμαtract τα δεδομένα από την ακέραια παράσταση. Ας γράψουμε ένα πρόγραμμα που να δείχνει τη χρήση τελεστών μετατόπισης bitwise.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int c = 0; c = a << 2; /* 80 = 101000 */ printf("Left shift - Value of c is %d\n", c ); c = a >> 2; /*05 = 000101 */ printf("Right shift - Value of c is %d\n", c ); return 0; }
Παραγωγή:
Left shift - Value of c is 80 Right shift - Value of c is 5
Μετά την εκτέλεση της λειτουργίας αριστερής μετατόπισης, η τιμή θα γίνει 80 του οποίου το δυαδικό ισοδύναμο είναι 101000.
Μετά την εκτέλεση της λειτουργίας δεξιάς μετατόπισης, η τιμή θα γίνει 5 του οποίου το δυαδικό ισοδύναμο είναι 000101.
Χειριστής συμπληρώματος bitwise
Το συμπλήρωμα bitwise καλείται επίσης ως τελεστής συμπληρώματος κάποιου αφού παίρνει πάντα μόνο μία τιμή ή έναν τελεστή. Είναι ένας μοναδικός χειριστής.
Όταν εκτελούμε συμπλήρωμα σε οποιαδήποτε bit, όλα τα 1 γίνονται 0 και το αντίστροφο.
Εάν έχουμε μια ακέραια παράσταση που περιέχει 0000 1111, τότε μετά την εκτέλεση της λειτουργίας συμπληρώματος bitwise η τιμή θα γίνει 1111 0000.
Ο τελεστής συμπληρώματος δυαδικών ψηφίων συμβολίζεται με tilde συμβόλου (~).
Ας γράψουμε ένα πρόγραμμα που δείχνει την υλοποίηση του τελεστή συμπληρώματος bitwise.
#include <stdio.h> int main() { int a = 10; /* 10 = 1010 */ int c = 0; c = ~(a); printf("Complement - Value of c is %d\n", c ); return 0; }
Παραγωγή:
Complement - Value of c is -11
Ακολουθεί ένα άλλο πρόγραμμα, με ένα παράδειγμα όλων των τελεστών που συζητήθηκαν μέχρι στιγμής:
#include <stdio.h> main() { unsigned int x = 48; /* 48 = 0011 0000 */ unsigned int y = 13; /* 13 = 0000 1101 */ int z = 0; z =x & y; /* 0 = 0000 0000 */ printf("Bitwise AND Operator - x & y = %d\n", z ); z = x | y; /* 61 = 0011 1101 */ printf("Bitwise OR Operator - x | y = %d\n", z ); z= x^y; /* 61 = 0011 1101 */ printf("Bitwise XOR Operator- x^y= %d\n", z); z = ~x; /*-49 = 11001111 */ printf("Bitwise One's Complement Operator - ~x = %d\n", z); z = x << 2; /* 192 = 1100 0000 */ printf("Bitwise Left Shift Operator x << 2= %d\n", z ); z= x >> 2; /* 12 = 0000 1100 */ printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}
Αφού μεταγλωττίσουμε και εκτελέσουμε το πρόγραμμα, παράγει το ακόλουθο αποτέλεσμα:
Bitwise AND Operator - x & y = 0 Bitwise OR Operator - x | y = 61 Bitwise XOR Operator- x^y= 61 Bitwise One's Complement Operator - ~x = -49 Bitwise Left Shift Operator x << 2= 192 Bitwise Right Shift Operator x >> 2= 12
