Bitwise OperaTors σε C: AND, OR, XOR, Shift & Συμπλήρωμα

Τι είναι το Bitwise Operators;

Bitwise Operaκορμοί χρησιμοποιούνται για το χειρισμό δεδομένων σε επίπεδο 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

Οι τελεστές bitwise shift χρησιμοποιούνται για τη μετακίνηση/μετατόπιση των μοτίβων 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 μπορούν να συνδυαστούν και στη συνέχεια να χρησιμοποιηθούν για την εξαγωγή των δεδομένων από την ακέραια έκφραση. Ας γράψουμε ένα πρόγραμμα για να δείξουμε τη χρήση τελεστών bitwise shift.

#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

Εδώ είναι ένα άλλο πρόγραμμα, με ένα παράδειγμα όλων των operatoes που συζητήθηκαν μέχρι τώρα:

#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

Σύνοψη

  • Οι τελεστές bitwise είναι ειδικά σετ τελεστών που παρέχονται από το 'C.'
  • Χρησιμοποιούνται στον προγραμματισμό σε επίπεδο bit.
  • Αυτοί οι τελεστές χρησιμοποιούνται για τον χειρισμό bits μιας ακέραιας έκφρασης.
  • Το λογικό, το shift και το συμπλήρωμα είναι τρεις τύποι τελεστών bitwise.
  • Ο τελεστής συμπληρώματος bitwise χρησιμοποιείται για να αντιστρέψει τα bit μιας έκφρασης.