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

⚡ Έξυπνη Σύνοψη

Οι τελεστές bitwise στη C χειρίζονται δεδομένα σε επίπεδο μεμονωμένων bit, χρησιμοποιώντας λειτουργίες AND, OR, XOR, συμπλήρωμα και μετατόπιση σε ακέραιους τελεστές για την εκτέλεση ταχύτερων υπολογισμών, τη συσκευασία σημαιών και τον έλεγχο υλικού σε προγραμματισμό χαμηλού επιπέδου και ενσωματωμένο.

  • 🧮 Operators: Έξι τελεστές — ΚΑΙ (&), Ή (|), XOR (^), συμπλήρωμα (~), μετατόπιση προς τα αριστερά (<<), μετατόπιση προς τα δεξιά (>>) — ενεργούν bit προς bit.
  • 🔗 ΚΑΙ & Ή: Το αποτέλεσμα & είναι 1 μόνο όταν και τα δύο bit είναι 1. Το | είναι 1 όταν οποιοδήποτε από τα δύο bit είναι 1.
  • 🔀 XOR: Το αποτέλεσμα ^ είναι 1 όταν ακριβώς ένα bit είναι 1, χρήσιμο για εναλλαγή bit και ανταλλαγήping αξιών.
  • ↔️ Shifts: Οι τελεστές << και >> σύρουν τα bits αριστερά ή δεξιά, πολλαπλασιάζοντας ή διαιρώντας με δυνάμεις του δύο.
  • 🔁 Συμπλήρωμα: Ο τελεστής ~ αντιστρέφει κάθε bit, έτσι το 0000 1111 γίνεται 1111 0000.
  • 🤖 Βοήθεια με την Τεχνητή Νοημοσύνη: Οι βοηθοί τεχνητής νοημοσύνης και το GitHub Copilot δημιουργούν και εξηγούν γρήγορα τη λογική bitmask και shift.

Bitwise Operators σε C

Τι είναι το 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

Συχνές Ερωτήσεις

Η λογική συνάρτηση AND (&) λειτουργεί σε μεμονωμένα bit και επιστρέφει έναν ακέραιο αριθμό, ενώ η λογική συνάρτηση AND (&&) ελέγχει ολόκληρες τις παραστάσεις και επιστρέφει μια μόνο λογική τιμή (αληθής ή ψευδής).

Shift 1 για να δημιουργήσετε μια μάσκα: ορίστε με τιμή | (1 << n), καθαρίστε με τιμή & ~ (1 << n) και εναλλάξτε με τιμή ^ (1 << n).

Μια μετατόπιση προς τα αριστερά κατά n πολλαπλασιάζει μια μη πρόσημη τιμή επί 2, η οποία ανεβαίνει σε n. Μια μετατόπιση προς τα δεξιά διαιρεί με αυτήν, επομένως οι μεταγλωττιστές χρησιμοποιούν μετατοπίσεις για ταχύτητα.

Ελέγξτε τον αριθμό & 1. Το χαμηλότερο bit επιστρέφει 1 για περιττές τιμές και 0 για ζυγές τιμές, ταχύτερα από τον τελεστή modulus.

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

Shift Οι τελεστές συνδέονται πιο σφιχτά από τους σχεσιακούς, ενώ οι &, ^ και | βρίσκονται κάτω από την ισότητα αλλά πάνω από τη λογική && και ||, οπότε χρησιμοποιήστε παρενθέσεις για λόγους ασφαλείας.

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

GitHub Copilot προτείνει μακροεντολές bitmask, βοηθούς set και clear-bit, και μαθηματικά shift από ένα σχόλιο· ελέγξτε τις ολοκληρώσεις του σε σχέση με τη διάταξη των bit σας.

Συνοψίστε αυτήν την ανάρτηση με: