Lucrul cu biti: shiftare si operatii logice
Lucrul cu biti: shiftare si operatii logice
Lucrul cu biti: shiftare si operatii logice
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