bitwise Operatori în C: AND, OR, XOR, Shift & Complement
Ce sunt Bitwise Operatori?
bitwise Operatori sunt folosite pentru manipularea datelor la nivel de biți, numite și programare la nivel de biți. Bitwise operează pe unul sau mai multe modele de biți sau numere binare la nivelul biților lor individuali. Ele sunt utilizate în calculele numerice pentru a accelera procesul de calcul.
Mai jos este lista operatorilor pe biți furnizați de limbajul de programare „C”:
OperaTdR | Sens |
---|---|
& | Operatorul AND pe biți |
| | Operator SAU pe biți |
^ | Operator OR exclusiv pe biți |
~ | Complementul lui binar Operator este un operator unar |
<< | Operator de schimbare la stânga |
>> | Operator schimbare dreapta |
Operatorii pe biți nu pot fi aplicați direct la tipurile de date primitive, cum ar fi float, double, etc. Amintiți-vă întotdeauna un lucru că operatorii pe biți sunt utilizați mai ales cu tipul de date întreg din cauza compatibilității sale.
Operatorii logici pe biți lucrează asupra datelor bit cu bit, pornind de la bitul cel mai puțin semnificativ, adică bitul LSB care este bitul din dreapta, lucrând spre MSB (Most Significant Bit) care este bitul din stânga.
Rezultatul calculului operatorilor logici pe biți este prezentat în tabelul de mai jos.
x | y | X y | x | Acolo | x^y |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
Bitwise ȘI
Acesta este unul dintre cei mai des utilizați operatori logici pe biți. Este reprezentat printr-un singur semn (&). Două expresii întregi sunt scrise pe fiecare parte a operatorului (&).
Rezultatul operației AND pe biți este 1 dacă ambii biți au valoarea 1; în caz contrar, rezultatul este întotdeauna 0.
Să considerăm că avem 2 variabile op1 și op2 cu valori după cum urmează:
Op1 = 0000 1101 Op2 = 0001 1001
Rezultatul operației AND pe variabilele op1 și op2 va fi
Result = 0000 1001
După cum putem vedea, două variabile sunt comparate bit cu bit. Ori de câte ori valoarea unui bit din ambele variabile este 1, atunci rezultatul va fi 1 sau 0.
OR bit
Este reprezentat printr-un singur semn de bară verticală (|). Două expresii întregi sunt scrise pe fiecare parte a operatorului (|).
Rezultatul operației OR pe biți este 1 dacă cel puțin una dintre expresii are valoarea 1; în caz contrar, rezultatul este întotdeauna 0.
Să considerăm că avem 2 variabile op1 și op2 cu valori după cum urmează:
Op1 = 0000 1101 Op2 = 0001 1001
Rezultatul operației OR pe variabilele op1 și op2 va fi
Result = 0001 1101
După cum putem vedea, două variabile sunt comparate bit cu bit. Ori de câte ori valoarea unui bit dintr-una dintre variabile este 1, atunci rezultatul va fi 1 sau 0.
Bitwise Exclusive SAU
Este reprezentată printr-un simbol (^). Două expresii întregi sunt scrise pe fiecare parte a operatorului (^).
Rezultatul operației Exclusive-OR pe biți este 1 dacă numai una dintre expresii are valoarea 1; în caz contrar, rezultatul este întotdeauna 0.
Să considerăm că avem 2 variabile op1 și op2 cu valori după cum urmează:
Op1 = 0000 1101 Op2 = 0001 1001
Rezultatul operației XOR pe variabilele op1 și op2 va fi
Result = 0001 0100
După cum putem vedea, două variabile sunt comparate bit cu bit. Ori de câte ori o singură variabilă deține valoarea 1, atunci rezultatul este 0, altfel 0 va fi rezultatul.
Să scriem un program simplu care demonstrează operatorii logici pe biți.
#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(); }
ieșire:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
Operatori de deplasare pe biți
Operatorii de deplasare pe biți sunt utilizați pentru a muta/deplasa modelele de biți fie spre stânga, fie spre dreapta. Stânga și dreapta sunt doi operatori de schimb furnizați de „C' care sunt reprezentate după cum urmează:
Operand << n (Left Shift) Operand >> n (Right Shift)
Aici,
- un operand este o expresie întreagă pe care trebuie să efectuăm operația de schimbare.
- „n” este numărul total de poziții de biți pe care trebuie să le deplasăm în expresia întreagă.
Operația de schimbare la stânga va muta numărul „n” de biți în partea stângă. Biții din stânga din expresie vor fi afișați, iar n biți cu valoarea 0 vor fi completați în partea dreaptă.
Operația de schimbare la dreapta va muta numărul „n” de biți în partea dreaptă. Cei din dreapta „n” biți din expresie vor fi afișați, iar valoarea 0 va fi completată în partea stângă.
Exemplu: x este o expresie întreagă cu datele 1111. După efectuarea operației de schimbare, rezultatul va fi:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
ShiftOperatorii s pot fi combinați, apoi pot fi utilizați pentru a extrage datele din expresia întreagă. Să scriem un program pentru a demonstra utilizarea operatorilor de deplasare pe biți.
#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; }
ieșire:
Left shift - Value of c is 80 Right shift - Value of c is 5
După efectuarea operației de schimbare la stânga, valoarea va deveni 80 al cărui echivalent binar este 101000.
După efectuarea operației de schimbare la dreapta, valoarea va deveni 5 al cărui echivalent binar este 000101.
Operator complement pe biți
Complementul pe biți este numit și operator de complement al cuiva, deoarece ia întotdeauna o singură valoare sau un operand. Este un operator unar.
Când efectuăm complement pe orice biți, toate 1urile devin 0 și invers.
Dacă avem o expresie întreagă care conține 0000 1111, atunci după efectuarea operației de complement pe biți, valoarea va deveni 1111 0000.
Operatorul de complement pe biți este notat cu simbolul tilde (~).
Să scriem un program care demonstrează implementarea operatorului complement pe biți.
#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; }
ieșire:
Complement - Value of c is -11
Iată un alt program, cu un exemplu de toate operatele discutate până acum:
#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 );}
După ce compilăm și rulăm programul, acesta produce următorul rezultat:
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
Rezumat
- Operatorii pe biți sunt seturi de operatori speciale furnizate de „C”.
- Ele sunt utilizate în programarea la nivel de biți.
- Acești operatori sunt utilizați pentru a manipula biți ai unei expresii întregi.
- Logic, shift și complement sunt trei tipuri de operatori pe biți.
- Operatorul complement pe biți este folosit pentru a inversa biții unei expresii.