3.2.6. Operatorii logici pe biti
2019/01/24 in Programare in C
Operatorii logici pe biti sunt:
- ~ - complement fata de unu (operator unar);
- << - deplasare spre stanga;
- >> - deplasare spre dreapta;
- & - si logic pe biti;
- ^ - sau exclusiv logic pe biti;
- | - sau logic pe biti.
Acesti operatori se aplica la operanzi de tip intreg. Ei se executa bit cu bit si operanzii se extind la 16 biti, daca este necesar.
Complementul fata de unu are aceeasi prioritate ca ceilalti operatori unari. El schimba fiecare bit 1 al operandului cu 0 si fiecare bit 0 al acestuia cu 1.
Exemple:
1.
~1234
1234 se exprima in binar astfel:
10011010010
Se extinde la 16 biti:
0000010011010010
apoi se aplica operatorul de complementare fata de 1:
1111101100101101
sau in octal:
0175455
2.
~-1234
Operatorii unari au aceeasi prioritate si se asociaza de la dreapta la stanga, deci intai se realizeaza negativarea si apoi complementarea fata de 1.
1234 se exprima in binar:
10011010010
se negativeaza:
1111101100101110
apoi se complementeaza fata de 1:
10011010001
sau in octal:
02321
3.
-~1234
In acest caz, intai se determina complementul fata de 1, apoi se negativeaza numarul.
1234 se exprima in binar:
10011010010
se complementeaza fata de 1:
1111101100101101
se negativeaza:
10011010011
sau in octal:
02323
Operatorii de deplasare sunt operatori binari. Ei au aceeasi prioritate, care este imediat mai mica decat a operatorilor aditivi si imediat mai mare decat a operatorilor relationali.
Operatorul << realizeaza o deplasare la stanga a valorii primului sau operand cu un numar de pozitii binare egal cu valoarea celui de-al doilea operand al sau. Aceasta operatie este echivalenta cu inmultirea cu puteri ale lui 2.
Operatorul >> realizeaza o deplasare la dreapta a valorii primului sau operand cu un numar de pozitii binare egal cu valoarea celui de-al doilea operand al sau. Aceasta operatie este echivalenta cu o impartire cu puteri ale lui 2.
Exemple:
1.
int a;
a<<3
are aceeasi valoare ca si:
a*8
adica se inmulteste a cu 23.
2.
int a;
a>>4
are aceeasi valoare ca si:
a/16
adica se imparte a la 24.
3.
~0<<3
Aceasta expresie se evalueaza astfel:
Se extinde 0 pe 16 biti:
0000000000000000
se aplica operatorul de complementare fata de 1:
1111111111111111
se fac 3 deplasari spre stanga:
1111111111111000
sau in octal:
177770
4.
~(~0<<3)
Rezultatul din exemplul precedent se complementeaza fata de 1:
0000000000000111
Operatorul si logic pe biti se executa bit cu bit, conform regulii:
- 1 & 1 = 1
- 1 & 0 = 0
- 0 & 1 = 0
- 0 & 0 = 0
Operatorul & are prioritatea imediat mai mica decat operatorii de egalitate. Se utilizeaza la anulari de biti.
Exemple:
1.
int a;
a&0377
are ca valoare, valoarea octetului mai putin semnificativ al valorii variabilei a.
Intr-adevar, se extinde constanta octala 0377 pe 16 biti:
0000000011111111
apoi se face si logic pe biti intre aceasta constanta si valoarea variabilei a. Se pastreaza ultimii 8 biti ai lui a, primii 8 biti anulandu-se.
2.
int a;
a&0177400
are ca valoare, valoarea lui a dupa ce s-au anulat ultimii 8 biti ai sai. Aceasta rezulta din faptul ca , constanta octala 0177400 are in binar valoarea:
1111111100000000
3.
int a;
a&0177776
are ca valoare cel mai mare numar par care nu il depaseste pe a.
1111111100000000
Observatie:
Diferenta dintre operatorul si logic (&&) si operatorul si logic pe biti (&) consta in aceea ca primul se realizeaza global, fata de al doilea, care se realizeaza pe biti.
Asa de exemplu, daca x = 2
si y = 1
, atunci x&&y
are valoarea 1, deoarece ambii operanzi sunt diferiti de 0.
In schimb, x&y
are valoarea 0. Intr-adevar, in acest caz se realizeaza un si pe biti cu valorile:
x=0000000000000010
y=0000000000000001
--------------------
x&y=0000000000000000
Operatorul sau exclusiv pe biti se executa bit cu bit, conform regulii:
- 1 ^ 1 = 0
- 1 ^ 0 = 1
- 0 ^ 1 = 1
- 0 ^ 0 = 0
Operatorul ^ are prioritatea imediat mai mica decat operatorul &. Se utilizeaza pentru a anula sau pozitiona diferiti biti.
Exemple:
1.
int a;
a^a
are valoarea 0. Intr-adevar, cei doi operanzi fiind identici, se executa operatorul ^ pentru biti identici, ori in acest caz el are ca rezultat pe 0.
2.
int a;
a^1
are o valoare care depinde de paritatea lui a. Intr-adevar, daca a este par, atunci ultimul sau bit este 0.
Expresia a^1
seteaza la valoarea 1 ultimul bit al lui a. In felul acesta, rezultatul este egal cu
cel mai mic numar impar care-l depaseste pe a.
Daca a este impar, atunci ultimul sau bit are valoarea 1. Expresia a^1
anuleaza ultimul bit al lui a.
Deci, rezultatul este egal cu cel mai mare numar par care nu-l depaseste pe a.
Operatorul sau logic pe biti se executa bit cu bit, conform regulii:
- 1 | 1 = 1
- 1 | 0 = 1
- 0 | 1 = 1
- 0 | 0 = 0
Operatorul | are prioritatea imediat mai mica decat operatorul sau excusiv pe biti (^) si imediat mai mare decat operatorul si logic (&&).
Acest operator se foloseste la setari de biti.
Exemple:
1.
int a;
a|1
are o valoare a carui ultim bit este 1, indiferent de valoarea variabilei a. Ceilalti biti corespund cu cei ai lui a. De aceea, valoarea acestei expresii este egala cu cel mai mic numar impar care nu este mai mic decat a.
2.
int a;
a|0100000
are o valoare cu bitul cel mai semnificativ setat, indiferent de valoarea variabilei a. Ceilalti biti corespund cu cei ai lui a.