11.04.2013 Views

Lucrul cu biti: shiftare si operatii logice

Lucrul cu biti: shiftare si operatii logice

Lucrul cu biti: shiftare si operatii logice

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Lucrul</strong> <strong>cu</strong> <strong>biti</strong>: <strong>shiftare</strong> <strong>si</strong> <strong>operatii</strong> <strong>logice</strong><br />

Dupa <strong>cu</strong>m se stie, cal<strong>cu</strong>latorul foloseste baza 2 pentru a stoca <strong>si</strong> prelucra informatiile, fie<br />

ca acestea sunt reprezentate de do<strong>cu</strong>mente text, filme, muzica sau chiar un <strong>si</strong>mplu numar intreg.<br />

Din acest motiv, fiecare limbaj de programare a nece<strong>si</strong>tat implementarea unor <strong>operatii</strong> care sa<br />

permita accesul direct la forma binara a datelor.<br />

Shiftarea <strong>biti</strong>lor<br />

(din engl. “to shift” = a muta, a deplasa)<br />

Asa <strong>cu</strong>m <strong>si</strong> traducerea o sugereaza, <strong>shiftare</strong>a <strong>biti</strong>lor este o deplasare a acestora po<strong>si</strong>bila in<br />

doua directii: la stanga sau la dreapta. Vom lua ca exemplu numarul 5 reprezentat binar pe 8 <strong>biti</strong>:<br />

00000101. In limbajul C++ exista trei operatori care pot fi folo<strong>si</strong>ti pentru a shifta <strong>biti</strong>:<br />

• > (operator aritmetic sau <strong>cu</strong> semn de <strong>shiftare</strong> la dreapta)<br />

Mai exista un operator, “>>>” – operator logic de <strong>shiftare</strong> la dreapta – dar aparent nu exista in<br />

C++, asa ca ma voi rezuma doar la cei doi de mai sus.<br />

Observatie: shiftarile <strong>biti</strong>lor nu sunt permutari, asadar nu avem de a face <strong>cu</strong> permutari<br />

cir<strong>cu</strong>lare!<br />

1. “


10>>1 = 00000101 = 5<br />

20>>2 = 00000101 = 5<br />

40>>3 = 00000101 = 5<br />

unde, la fel ca la “>y = x/2 y , unde “/” este impartirea intreaga din<br />

C++.<br />

Observatie: <strong>shiftare</strong>a la dreapta nu re<strong>cu</strong>pereaza <strong>biti</strong>i pierduti printr-o <strong>shiftare</strong> la stanga!<br />

Exemplu:<br />

939 524 102 = 00111000 00000000 00000000 00000110<br />

939 524 102


Pentru exemplu vom folo<strong>si</strong> in continuare doua numere (mai mici ) :<br />

Notatie Valoare (baza 10) Valoare (baza 2)<br />

x 14 1110<br />

y 11 1011<br />

1. NOT (complementul)<br />

Inverseaza valoarea fiecarui bit din operand: 1 devine 0 <strong>si</strong> 0 devine 1. Operatorul<br />

complementului in C++ este “~” (tilde).<br />

x 1110 14<br />

~x 0001 1<br />

y 1011 11<br />

~y 0100 4<br />

Observatie: complementul este un operator unar, <strong>si</strong>ngurul de acest tip dintre <strong>operatii</strong>le<br />

booleene; celelalte trei compara doua reprezentari binare de aceea<strong>si</strong> lungime, bit <strong>cu</strong> bit ( de pe<br />

acelea<strong>si</strong> pozitii), creand o noua reprezentare in functie de operatorul folo<strong>si</strong>t.<br />

2. AND<br />

Daca ambii <strong>biti</strong> sunt egali <strong>cu</strong> 1, rezultatul va fi 1. Altfel, rezultatul va fi 0. Operatorul in<br />

C++ al operatiei “<strong>si</strong>” pe <strong>biti</strong> este “&”.<br />

x 1110 14<br />

y 1011 11<br />

x & y 1010 10<br />

3. OR<br />

Rezultatul va fi 1 daca cel putin unul din cei doi <strong>biti</strong> comparati va fi egal <strong>cu</strong> 1.<br />

Operatorul in C++ al operatiei “sau” pe <strong>biti</strong> este “|”.<br />

x 1110 14<br />

y 1011 11<br />

x | y 1111 15<br />

4. XOR (sau exclu<strong>si</strong>v)<br />

Valoarea rezultata in urma acestei <strong>operatii</strong> este 1 daca cei doi <strong>biti</strong> comparati sunt<br />

diferiti (unul este 0 iar celalalalt 1, indiferent de ordine) <strong>si</strong> 0 daca sunt identici (ambii sunt egali<br />

<strong>cu</strong> 1 sau <strong>cu</strong> 0). Operatorul lui “sau exclu<strong>si</strong>v” in C++ este “^”.


x 1110 14<br />

y 1011 11<br />

x ^ y 0101 5<br />

Aceste <strong>operatii</strong> booleene, in special XOR, sunt folo<strong>si</strong>te in algoritmi de criptare <strong>si</strong> in<br />

functii de disper<strong>si</strong>e ( functii hash) pre<strong>cu</strong>m MD5.<br />

Proprietati<br />

Fie a un numar intreg. Aruncand o s<strong>cu</strong>rta privire se pot observa cateva proprietati ale <strong>operatii</strong>lor<br />

pe <strong>biti</strong>:<br />

a ^ a = 0<br />

a ^ 0 = a<br />

a | a = a<br />

a | 0 = a<br />

a & ( ~ a) = 0<br />

a | ( ~ a) = 1111…11 ( in functie de marimea lui a)<br />

a ^ ( ~ a) = 1111…11 (in functie de marimea lui a)<br />

Pentru a cal<strong>cu</strong>la alte valori se poate folo<strong>si</strong> programul din dotare ( Bitwise operations).<br />

Exit (0)<br />

Atat despre lucrul <strong>cu</strong> <strong>biti</strong> deocamdata. Pe masura ce voi descoperi ceva nou, voi fi bu<strong>cu</strong>ros sa<br />

adaug aici sau sa concept un alt do<strong>cu</strong>ment mai vast <strong>si</strong> ceva mai colorat . De<strong>si</strong>gur, daca veti<br />

descoperi greseli in acest articol puteti sa ma atentionati pe mail.<br />

Bibliografie, resurse:<br />

1. http://www.cplusplus.com<br />

2. http://stackoverflow.com/questions/141525?sort=votes<br />

©Ovidiu Porumb 2009

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!