P. 1
Lucrul Cu Biti

Lucrul Cu Biti

|Views: 0|Likes:
Published by Lavinia Maria
Lucrul Cu Biti
Lucrul Cu Biti

More info:

Published by: Lavinia Maria on Apr 08, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

01/10/2015

pdf

text

original

Lucrul cu biti: shiftare si operatii logice

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 “<<”. 2 si 3 reprezinta numarul de pasi. Din nou se poate formula o conjectura : avand doua numere x si y => x>>y = x/2y. operatiile booleene sunt cautate mai mult zilele acestea datorita utilizarii lor in criptografie. Operatii logice pe biti Aceste operatii poarta numele de operatii booleene. 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). dupa matematicianul George Boole. inventatorul algebrei booleene. unde “/” este impartirea intreaga din C++. Desi stau la baza calcului computerizat. 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 ! && || . 1.

Pentru exemplu vom folosi in continuare doua numere (mai mici  ) : Notatie x y 1. Operatorul lui “sau exclusiv” in C++ este “^”. Operatorul in C++ al operatiei “sau” pe biti este “|”. AND Daca ambii biti sunt egali cu 1. NOT (complementul) Inverseaza valoarea fiecarui bit din operand: 1 devine 0 si 0 devine 1. x y x|y 4. 2. Operatorul complementului in C++ este “~” (tilde). OR Rezultatul va fi 1 daca cel putin unul din cei doi biti comparati va fi egal cu 1. x y x&y 3. bit cu bit ( de pe aceleasi pozitii). celelalte trei compara doua reprezentari binare de aceeasi lungime. rezultatul va fi 1. creand o noua reprezentare in functie de operatorul folosit. rezultatul va fi 0. Altfel. singurul de acest tip dintre operatiile booleene. indiferent de ordine) si 0 daca sunt identici (ambii sunt egali cu 1 sau cu 0). 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. 1110 1011 1111 14 11 15 1110 1011 1010 14 11 10 . XOR (sau exclusiv) Valoarea rezultata in urma acestei operatii este 1 daca cei doi biti comparati sunt diferiti (unul este 0 iar celalalalt 1. Operatorul in C++ al operatiei “si” pe biti este “&”.

x y x^y 1110 1011 0101 14 11 5 Aceste operatii booleene. Proprietati Fie a un numar intreg. Desigur. http://www. http://stackoverflow. daca veti descoperi greseli in acest articol puteti sa ma atentionati pe mail. Bibliografie. sunt folosite in algoritmi de criptare si in functii de dispersie ( functii hash) precum MD5. voi fi bucuros sa adaug aici sau sa concept un alt document mai vast si ceva mai colorat  . Exit (0) Atat despre lucrul cu biti deocamdata. Pe masura ce voi descoperi ceva nou. in special XOR.cplusplus. resurse: 1.com/questions/141525?sort=votes ©Ovidiu Porumb 2009 .com 2. Aruncand o scurta privire se pot observa cateva proprietati ale operatiilor pe biti: a^a=0 a^0=a a|a=a a|0=a a & ( ~ a) = 0 a | ( ~ a) = 1111…11 a ^ ( ~ a) = 1111…11 ( in functie de marimea lui a) (in functie de marimea lui a) Pentru a calcula alte valori se poate folosi programul din dotare  ( Bitwise operations).

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->