Σε αυτό το σεμινάριο, θα μάθουμε για τους τελεστές του C ++ με τη βοήθεια παραδειγμάτων.
Στο C ++, οι τελεστές bitwise εκτελούν λειτουργίες σε ακέραια δεδομένα σε κάθε επίπεδο bit. Αυτές οι λειτουργίες περιλαμβάνουν δοκιμή, ρύθμιση ή αλλαγή των πραγματικών bit. Για παράδειγμα,
a & b; a | b;
Ακολουθεί μια λίστα με 6 τελεστές που περιλαμβάνονται στο C ++.
Χειριστής | Περιγραφή |
---|---|
& | Bitwise ΚΑΙ τελεστής |
| | Bitwise Ή χειριστής |
^ | Χειριστής Bitwise XOR |
~ | Διαχειριστής συμπληρώματος Bitwise |
<< | Bitwise Shift Αριστερός τελεστής |
>> | Bitwise Shift Right Operator |
Αυτοί οι τελεστές είναι απαραίτητοι επειδή η Μονάδα Αριθμητικής-Λογικής (ALU) που υπάρχει στην CPU του υπολογιστή εκτελεί αριθμητικές λειτουργίες στο επίπεδο bit.
Σημείωση: Οι τελεστές Bitwise μπορούν να χρησιμοποιηθούν παράλληλα char
και int
τύπους δεδομένων.
1. C ++ Bitwise AND Operator
Ο τελεστής AND bitwise &
επιστρέφει 1 εάν και μόνο εάν και οι δύο τελεστές είναι 1 . Διαφορετικά, επιστρέφει 0 .
Ο παρακάτω πίνακας δείχνει τη λειτουργία του χειριστή bitwise AND . Αφήστε τα a και b να είναι δύο τελεστές που μπορούν να πάρουν μόνο δυαδικές τιμές, δηλαδή 1 και 0 .
ένα | σι | α & β |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Σημείωση: Ο παραπάνω πίνακας είναι γνωστός ως "Truth Table" για τον τελεστή bitwise AND .
Ας ρίξουμε μια ματιά στη λειτουργία bitwise AND δύο ακέραιων αριθμών 12 και 25:
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) // Bitwise ΚΑΙ Λειτουργία 12 και 25 00001100 & 00011001 _________ 00001000 = 8 (Σε δεκαδικό)
Παράδειγμα 1: Bitwise AND
#include using namespace std; int main() ( // declare variables int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a & b = " << (a & b) << endl; return 0; )
Παραγωγή
a = 12 b = 25 a & b = 8
Στο παραπάνω παράδειγμα, έχουμε δηλώσει δύο μεταβλητές α και β. Εδώ, παρατηρήστε τη γραμμή,
cout << "a & b = " << (a & b) << endl;
Εδώ, εκτελούμε bitwise AND μεταξύ των μεταβλητών a και b.
2. C ++ Bitwise Ή χειριστής
Ο χειριστής bitwise OR |
επιστρέφει 1 εάν τουλάχιστον ένας από τους τελεστές είναι 1 . Διαφορετικά, επιστρέφει 0 .
Ο παρακάτω πίνακας αλήθειας δείχνει τη λειτουργία του χειριστή bitwise OR . Αφήστε τα a και b να είναι δύο τελεστές που μπορούν να πάρουν μόνο δυαδικές τιμές, δηλαδή 1 ή 0 .
ένα | σι | α | σι |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Ας δούμε τη λειτουργία bitwise Ή δύο ακέραιων αριθμών 12 και 25 :
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bitwise Ή Λειτουργία 12 και 25 00001100 | 00011001 _________ 00011101 = 29 (με δεκαδικό)
Παράδειγμα 2: Bitwise Ή
#include int main() ( int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a | b = " << (a | b) << endl; return 0; )
Παραγωγή
α = 12 β = 25 α | b = 29
Η bitwise OR της a = 12
και b = 25
δίνει 29
.
3. Χειριστής C ++ Bitwise XOR
Ο τελεστής XOR ^
επιστρέφει 1 εάν και μόνο εάν ένας από τους τελεστές είναι 1 . Ωστόσο, εάν και οι δύο τελεστές είναι 0 ή αν και οι δύο είναι 1 , τότε το αποτέλεσμα είναι 0 .
Ο παρακάτω πίνακας αλήθειας δείχνει τη λειτουργία του χειριστή bitor XOR . Αφήστε τα a και b να είναι δύο τελεστές που μπορούν να πάρουν μόνο δυαδικές τιμές, δηλαδή 1 ή 0 .
ένα | σι | α β |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Ας δούμε τη λειτουργία bitor XOR δύο ακέραιων αριθμών 12 και 25:
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bitwise XOR Λειτουργία 12 και 25 00001100 00011001 _________ 00010101 = 21 (Σε δεκαδικό)
Παράδειγμα 3: Bitwise XOR
#include int main() ( int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a b = " << (a b) << endl; return 0; )
Παραγωγή
a = 12 b = 25 a b = 21
Η bitwise XOR του a = 12
και b = 25
δίνει 21
.
4. C ++ Bitwise Complement Operator
Ο τελεστής συμπληρώματος bitwise είναι ένας unary τελεστής (λειτουργεί μόνο σε έναν τελεστή). Υποδηλώνεται από ~
αυτό που αλλάζει δυαδικά ψηφία 1 σε 0 και 0 σε 1 .
Είναι σημαντικό να σημειωθεί ότι το συμπληρωματικό δεξιόστροφο οποιουδήποτε ακέραιου Ν είναι ίσο με - (N + 1) . Για παράδειγμα,
Σκεφτείτε έναν ακέραιο αριθμό 35 . Σύμφωνα με τον κανόνα, το δεξιόστροφο συμπλήρωμα του 35 πρέπει να είναι - (35 + 1) = -36 . Τώρα, ας δούμε αν έχουμε τη σωστή απάντηση ή όχι.
35 = 00100011 (In Binary) // Using bitwise complement operator ~ 00100011 __________ 11011100
In the above example, we get that the bitwise complement of 00100011 (35) is 11011100. Here, if we convert the result into decimal we get 220.
However, it is important to note that we cannot directly convert the result into decimal and get the desired output. This is because the binary result 11011100 is also equivalent to -36.
To understand this we first need to calculate the binary output of -36. We use 2's complement to calculate the binary of negative integers.
2's Complement
The 2's complement of a number N gives -N.
In binary arithmetic, 1's complement changes 0 to 1 and 1 to 0.
And, if we add 1 to the result of the 1's complement, we get the 2's complement of the original number.
For example,
36 = 00100100 (In Binary) 1's Complement = 11011011 2's Complement : 11011011 + 1 _________ 11011100
Here, we can see the 2's complement of 36 (i.e. -36) is 11011100. This value is equivalent to the bitwise complement of 35 that we have calculated in the previous section.
Hence, we can say that the bitwise complement of 35 = -36.
Example 4: Bitwise Complement
#include int main() ( int num1 = 35; int num2 = -150; cout << "~(" << num1 << ") = " << (~num1) << endl; cout << "~(" << num2 << ") = " << (~num2) << endl; return 0; )
Output
~(35) = -36 ~(-150) = 149
In the above example, we declared two integer variables num1 and num2, and initialized them with the values of 35
and -150
respectively.
We then computed their bitwise complement with the codes (~num1)
and (~num2)
respectively and displayed them on the screen.
The bitwise complement of 35 = - (35 + 1) = -36 i.e. ~35 = -36 The bitwise complement of -150 = - (-150 + 1) = - (-149) = 149 i.e. ~(-150) = 149
This is exactly what we got in the output.
C++ Shift Operators
There are two shift operators in C++ programming:
- Right shift operator
>>
- Left shift operator
<<
5. C++ Right Shift Operator
The right shift operator shifts all bits towards the right by a certain number of specified bits. It is denoted by >>
.
Όταν αλλάζουμε οποιοδήποτε αριθμό προς τα δεξιά, τα λιγότερο σημαντικά bit απορρίπτονται, ενώ τα πιο σημαντικά bit αντικαθίστανται από μηδενικά.
ένα bit Right ShiftΌπως μπορούμε να δούμε από την παραπάνω εικόνα, έχουμε έναν αριθμό 4-bit . Όταν εκτελούμε μια λειτουργία δεξιάς μετατόπισης ενός bit , κάθε μεμονωμένο bit μετακινείται προς τα δεξιά κατά 1 bit.
Ως αποτέλεσμα, το δεξί bit με το μεγαλύτερο μέρος απορρίπτεται, ενώ το bit με το αριστερό μέρος παραμένει κενό. Αυτή η κενή θέση αντικαθίσταται από 0 .
6. Χειριστής C ++ Left Shift
Ο χειριστής αριστεράς μετατόπισης μετατοπίζει όλα τα δυφία προς τα αριστερά από έναν ορισμένο αριθμό καθορισμένων δυφίων . Δηλώνεται με <<
.
As we can see from the image above, we have a 4-bit number. When we perform a 1 bit left shift operation on it, each individual bit is shifted to the left by 1 bit.
As a result, the left-most bit is discarded, while the right-most bit remains vacant. This vacancy is replaced by a 0.
Example 5: Shift Operators
#include int main() ( // declaring two integer variables int num = 212, i; // Shift Right Operation cout << "Shift Right:" << endl; // Using for loop for shifting num right from 0 bit to 3 bits for (i = 0; i < 4; i++) ( cout <> " << i << " = " <> i) << endl; ) // Shift Left Operation cout << "Shift Left:" << endl; // Using for loop for shifting num left from 0 bit to 3 bits for (i = 0; i < 4; i++) ( cout << "212 << " << i << " = " << (212 << i) << endl; ) return 0; )
Output
Shift Right: 212>> 0 = 212 212>> 1 = 106 212>> 2 = 53 212>> 3 = 26 Shift Left: 212 << 0 = 212 212 << 1 = 424 212 << 2 = 848 212 << 3 = 1696
From the output of the program above, we can infer that, for any number N, the results of the shift right operator are:
N>> 0 = N N>> 1 = (N>> 0) / 2 N>> 2 = (N>> 1) / 2 N>> 3 = (N>> 2) / 2
and so on.
Similarly, the results of the shift left operator are:
N << 0 = N N << 1 = (N << 0) * 2 N << 2 = (N << 1) * 2 N << 3 = (N << 2) * 2
and so on.
Hence we can conclude that,
N>> m = ( N>> (m-1) ) / 2 N << m = ( N << (m-1) ) * 2
In the above example, note that the int
data type stores numbers in 32-bits i.e. an int
value is represented by 32 binary digits.
However, our explanation for the bitwise shift operators used numbers represented in 4-bits.
For example, the base-10 number 13 can be represented in 4-bit and 32-bit as:
4-bit Representation of 13 = 1101 32-bit Representation of 13 = 00000000 00000000 00000000 00001101
Ως αποτέλεσμα, η λειτουργία αριστερόστροφης μετατόπισης για 13 (και οποιοσδήποτε άλλος αριθμός) μπορεί να διαφέρει ανάλογα με τον αριθμό των bit που αντιπροσωπεύονται.
Επειδή στην αναπαράσταση 32-bit , υπάρχουν πολλά περισσότερα bit που μπορούν να μετατοπιστούν αριστερά σε σύγκριση με την αναπαράσταση 4-bit .