3.2.6. Operatorii logici pe biti

2019/01/24 in Programare in C

Operatorii logici pe biti sunt:

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:

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:

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:

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.

3.2.7. Operatorii de atribuire