Professional Documents
Culture Documents
Dupa cum se stie, calculatorul foloseste baza 2 pentru a stoca si prelucra informatiile, fie ca acestea sunt reprezentate de documente text, filme, muzica sau chiar un simplu numar intreg. Din acest motiv, fiecare limbaj de programare a necesitat implementarea unor operatii care sa permita accesul direct la forma binara a datelor. Shiftarea bitilor (din engl. to shift = a muta, a deplasa) Asa cum si traducerea o sugereaza, shiftarea bitilor este o deplasare a acestora posibila in doua directii: la stanga sau la dreapta. Vom lua ca exemplu numarul 5 reprezentat binar pe 8 biti: 00000101. In limbajul C++ exista trei operatori care pot fi folositi pentru a shifta biti: << (operator de shiftare la stanga) >> (operator aritmetic sau cu semn de shiftare la dreapta) Mai exista un operator, >>> operator logic de shiftare la dreapta dar aparent nu exista in C++, asa ca ma voi rezuma doar la cei doi de mai sus. Observatie: shiftarile bitilor nu sunt permutari, asadar nu avem de a face cu permutari circulare!
1. <<
Shiftarea la stanga se realizeaza mutand toti bitii numarului la stanga cu un anumit numar de pasi si completand bitii din coada (din dreapta) cu valoarea 0. Un exemplu: 5<<1 = 00001010 = 10 5<<2 = 00010100 = 20 5<<3 = 00101000 = 40 unde 1, 2 si 3 reprezinta numarul de pasi. Dupa cum se observa 5 shiftat cu 1, 2 si 3 da 10 (5*2), 20 (5*4), respectiv 40 (5*8). Asadar, avand doua numere x si y => x<<y = x*2y. Observatie: shiftarea la stanga nu este o shiftare circulara! Exemplu: 3 758 096 384 = 11100000 00000000 00000000 00000000 3 758 096 384<<1 = 11000000 00000000 00000000 00000000 adica 3 758 096 384<<1 = 3 221 225 472. Asadar la numere mari care incap pe 32 de biti apar deviatii de la regula de mai sus, iar bitul (bitii, in functie de numarul de pasi) din stanga este ( sunt) pierdut ( in exemplul nostru, cel marcat).
2. >>
Este exact opusa shiftarii la stanga. Exemplu:
10>>1 = 00000101 = 5 20>>2 = 00000101 = 5 40>>3 = 00000101 = 5 unde, la fel ca la <<, 1, 2 si 3 reprezinta numarul de pasi. Din nou se poate formula o conjectura : avand doua numere x si y => x>>y = x/2y, unde / este impartirea intreaga din C++. Observatie: shiftarea la dreapta nu recupereaza bitii pierduti printr-o shiftare la stanga! Exemplu: 939 524 102 = 00111000 00000000 00000000 00000110 939 524 102<<4 = 2 147 483 744 2 147 483 744 = 10000000 00000000 00000000 01100000 dar ((939 524 102 << 4) >> 4) = 134 217 734 134 217 734 = 00001000 00000000 00000000 00000110 Cam atat despre shiftarea pe biti in C++. Pentru o verificare se poate folosi programul atasat (Shifting bits). Operatii logice pe biti Aceste operatii poarta numele de operatii booleene, dupa matematicianul George Boole, inventatorul algebrei booleene. Desi stau la baza calcului computerizat, operatiile booleene sunt cautate mai mult zilele acestea datorita utilizarii lor in criptografie. Operatiile booleene pe biti si operatorii acestora in C++ sunt: Operatie pe biti NOT AND OR XOR Operator ~ & | ^
Observatie: a nu se confunda primele trei operatii pe biti cu cele logice folosite de obicei la compunerea unei conditii! Operatie logica NOT AND OR Operator ! && ||
Pentru exemplu vom folosi in continuare doua numere (mai mici ) : Notatie x y 1. NOT (complementul) Inverseaza valoarea fiecarui bit din operand: 1 devine 0 si 0 devine 1. Operatorul complementului in C++ este ~ (tilde). x ~x y ~y 1110 0001 1011 0100 14 1 11 4 Valoare (baza 10) 14 11 Valoare (baza 2) 1110 1011
Observatie: complementul este un operator unar, singurul de acest tip dintre operatiile booleene; celelalte trei compara doua reprezentari binare de aceeasi lungime, bit cu bit ( de pe aceleasi pozitii), creand o noua reprezentare in functie de operatorul folosit. 2. AND Daca ambii biti sunt egali cu 1, rezultatul va fi 1. Altfel, rezultatul va fi 0. Operatorul in C++ al operatiei si pe biti este &. x y x&y 3. OR Rezultatul va fi 1 daca cel putin unul din cei doi biti comparati va fi egal cu 1. Operatorul in C++ al operatiei sau pe biti este |. x y x|y 4. XOR (sau exclusiv) Valoarea rezultata in urma acestei operatii este 1 daca cei doi biti comparati sunt diferiti (unul este 0 iar celalalalt 1, indiferent de ordine) si 0 daca sunt identici (ambii sunt egali cu 1 sau cu 0). Operatorul lui sau exclusiv in C++ este ^. 1110 1011 1111 14 11 15 1110 1011 1010 14 11 10
x y x^y
14 11 5
Aceste operatii booleene, in special XOR, sunt folosite in algoritmi de criptare si in functii de dispersie ( functii hash) precum MD5. Proprietati Fie a un numar intreg. Aruncand o scurta privire se pot observa cateva proprietati ale operatiilor pe biti:
Pentru a calcula alte valori se poate folosi programul din dotare ( Bitwise operations).
Exit (0) Atat despre lucrul cu biti deocamdata. Pe masura ce voi descoperi ceva nou, voi fi bucuros sa adaug aici sau sa concept un alt document mai vast si ceva mai colorat . Desigur, daca veti descoperi greseli in acest articol puteti sa ma atentionati pe mail.