You are on page 1of 6

Tipuri de date i baze de numeraie

Algoritmic i programare Laborator


Tabelul urmtor prezint echivalenele ntre sistemele binar, hexazecimal i zecimal, urmnd numere de 8 cifre binare, numite octei sau bytes, care ntotdeauna corespund la 2 cifre hexazecimale: bin hex dec bin hex dec ------------------------------------------------------------------------0000 = 0 = 0 10100111 = A7 167 0001 = 1 = 1 11001101 = CD 205 0010 = 2 = 2 11111111 = FF 255 0011 = 3 = 3 0100 = 4 = 4 0101 = 5 = 5 0110 = 6 = 6 0111 = 7 = 7 1000 = 8 = 8 1001 = 9 = 9 1010 = A = 10 1011 = B = 11 1100 = C = 12 1101 = D = 13 1110 = E = 14 1111 = F = 15

Aritmetica numerelor binare Adunarea n binar


Tabla adunrii a dou cifre binare este urmtoarea: 0 0 1 1 + + + + 0 1 0 1 = = = = 0 1 1 10 (cu "depire")

Ultimul rnd de mai sus se citete: "Unu plus unu este egal cu unu-zero (n baza 2)", valoarea lui 10(2) fiind desigur 2(10). Pe baza tablei de mai sus se pot aduna oricare 2 numere binare A i B. Exemplu (se ncepe de la dreapta): A 1 1 0 1 +B 1 0 1 0 1 ---------------=S 1 0 0 0 1 0 <== valoarea lui A este 13(10) (1 + 4 + 8) <== valoarea lui B este 21(10) (1 + 4 + 16) <== valoarea sumei este 34(10) (2 + 32).

Scderea
Scderea n sistemul binar funcioneaz foarte asemntor cu adunarea binar. Tabla scderii este: 0 0 1 1 0 1 0 1 = = = = 0 1 (cu "mprumut") 1 0

Pe aceast baz se pot scdea numere binare formate din mai multe 0-uri i 1uri. Operaia se execut poziie cu poziie, de la dreapta la stnga. La nevoie se folosete "mprumutul" de la poziia de mai la stnga. De exemplu: * * * <== coloanele marcate cu stelue se folosesc pentru mprumut <== A are valoarea zecimal 1 + 4 + 32 + 64 = 101(10) <== B are valoarea zecimal 1 + 2 + 8 + 16 = 27(10) <== diferena lor este D = 2 + 8 + 64 = 74(10)

A 1 1 0 0 1 0 1 B 1 1 0 1 1 -----------------=D 1 0 0 1 0 1 0

Scderea unui numr binar produce acelai rezultat cu adugarea aceluiai numr dar cu semn schimbat.

nmulirea
nmulirea (multiplicarea) n binar se bazeaz, la fel ca i n sistemul zecimal, pe adunare. Tabla nmulirii binare este: 0 0 1 1 x x x x 0 1 0 1 = = = = 0 0 0 1

Pentru a multiplica numerele binare A i B se fac nti produsele pariale ale lui A cu fiecare cifr binar a lui B, luate de la dreapta la stnga, i apoi se adun rezultatele pariale ntre ele. Produsele pariale ale fiecrei cifre din B cu A sunt: Dac cifra din B este un 0, atunci i produsul parial este 0, i nu are efect asupra adunrii; Dac cifra din B este un 1, atunci produsul parial al lui A cu 1 este chiar A. Exemplu 1010(2) x 11011(2): 1 1 0 1 1 1 0 1 0 --------0 0 0 0 0 + 1 1 0 1 1 <== A este egal cu 1 + 2 + 8 + 16 = 27(10) <== B este egal cu 2 + 8 = 10(10)

+ 0 0 0 0 0 + 1 1 0 1 1 ----------------1 0 0 0 0 1 1 1 0 * * * *

<== Produsul A x B = 2 + 4 + 8 + 256 = 270(10) <== depire (la adunare)

Conversia din zecimal n binar


Se mparte numrul ales la 2; restul reprezint cifra cea mai puin semnificativ (cea mai din dreapta) a rezultatului conversiei. Ctul se remparte la 2, se noteaz restul, i procedura se repet cu noul ct (recursiv). Operaia se sfrete cnd ctul devine nul. (Schema lui Horner) Aceast metod se poate aplica i la conversiunea n alte baze. Exemplu: S se converteasc numrul 243 din baza 10 n bazele 2 i 8.

Sistemul hexazecimal
Sistemul hexazecimal are baza 16 i utilizeaz 16 cifre hexazecimale, care se noteaz astfel: 0 1 2 3 4 5 6 7 8 9 A B C D E F. n acest ir de cifre hexazecimale, cifrele de la 0(16) la 9(16) au valorile zecimale echivalente, de la 0(10) la 9(10), iar cifrele A(16) ... F(16) au valorile zecimale de la 10(10) la 15(10). Pentru reprezentarea valorilor zecimale de la 0 la 15 sunt necesari exact 4 bii, ncepnd cu 0000 i sfrind cu 1111. Transformarea unui numr binar ntr-unul hexazecimal se face prin gruparea biilor n grupe de cte 4 bii, de la dreapta la stnga. Exemplu: 110110110111001(2) = (0)110 1101 1011 1001 = 6DB9(16). Transformarea invers, din hex n bin, se face prin nlocuirea fiecrei cifre hex prin combinaia corepunztoare de 4 bii. Pentru conversia unui numr real din baza 10 n baza 16, se analizeaz separat partea ntreag i partea zecimal. Exemplu: Numrul n baza 10 este: 123,14. Pentru conversia prii intregi 123(10) obinem: 123=16*7+11 -> restul 11, adic B(16) 7=16*0+7 -> restul 7, adic 7(16). Gsim c 123(10)=7B(16). Pentru conversia prii zecimale 0.14(10) procedm astfel: 0.14*16=2.24 -> pstrm 2, care devine prima cifr dup virgul n baza 16 0.24*16=3.84 -> pstrm 3, care devine a doua cifr dup virgul n baza 16 0.84*16=13.44 -> pstrm 13, adic D, care devine a 3-a cifr dup virgul 0.44*16=7.04 -> pstrm 7, care devine a 4-a cifr dup virgul n baza 16 s.a.m.d. Obinem: 0.14(10) = 0,23D7...(16)

Procesul continu pn cnd partea fracionar este zero sau avem suficiente cifre dup virgul.

// Urmatorul program este o exemplificare a metodelor de conversie intre diferite baze de numeratie, precum si a modului de utilizare a tipurilor de date in C++ #include<iostream> #include<stdlib.h> #include<string> #include<sstream> using namespace std; void main (void) { char inNouaBaza[256]; char nrBazeDiferite[] = "2001 60c0c0 -1101110100110100100000 0x6fffff"; char * pEnd; string sirCaractere; int a, b, nouaBaza, inZecimal; long c, d1, d2, d3, d4; double x, y; bool continuare=1; do { cout << "Introduceti numarul zecimal pe care doriti sa il convertiti : "; cin >> inZecimal; cout << "Introduceti noua baza de numeratie : "; cin >> nouaBaza; // Functia urmatoare converteste intregul 'input' in noua baza 'baza', // iar rezultatul este transferat in buffer-ul de tip sir de caractere // 'inNouaBaza'. // void itoa(int input, char *buffer, int baza); // O functie similara, 'ftoa', converteste o data de tip float intr-un // string. itoa(inZecimal, inNouaBaza, nouaBaza); // Functie similara de conversie din zecimal in hexazecimal este // sprintf(inHexazecimal,"%x",inZecimal); aici 'inHexazecimal' este // tot sir de caractere cout << "Numarul " << inZecimal << " devine in noua baza : " << inNouaBaza << endl; // In C afisarea conversiei din zecimal in hexazecimal putea fi // ealizata si astfel: // printf("%d in hexazecimal este %s\n",inZecimal,inNouaBaza); cout << "Doriti o noua conversie ? (0-Nu / 1-Da) : "; cin >> continuare; } while (continuare!=0); // Functia 'atoi' (ASCII to integer) e folosita pentru a converti un // string intr-un intreg, iar sintaxa sa este: // int atoi(const char *str); // Variabila 'str' e de tip string, reprezentat de un sir de caractere // ce contine reprezentarea unui intreg cu semn. // Daca atoi intalneste un sir fara secvente numerice va returna 0,

// insa acelasi rezultat poate aparea si daca exista o // secventa de caractere ce reprezinta numarul 0, fara a putea astfel // distinge cele doua situatii. Noua functie 'strtol' // elimina aceasta deficienta. Variante ale functiei 'atoi' sunt 'atol' // si 'atof' si sunt folosite pentru a converti un sir de caractere // in date de tip long sau double si au sintaxele urmatoare: // long atol(const char *str); // double atof(const char *str); cout << "Introduceti un nr. intreg ce va fi citit ca un sir de caractere : "; cin >> sirCaractere; stringstream(sirCaractere) >> a; // variabilei intregi 'a' ii este atribuita valoarea convertita din 'sirCaractere' cout << "Primul numar intreg obtinut este : " << a << "\n"; b=atoi("20"); // sirul de caractere '20' este convertit in valoare intreaga cout << "Al doilea numar intreg obtinut este : " << b << "\n"; x=atof("1.7"); cout << "Numarul de tip float convertit din sir de caractere este : " << x << endl; y=a+b+x; cout << "Suma celor trei numere este : " << y << endl; sprintf(inNouaBaza,"%x",int(y)); cout << "Partea intreaga a acestui numar, convertita in hexa este : " << inNouaBaza << endl; c = (y >= 0) ? (long)(y+0.5) : (long)(y-0.5); // are ca efect determinarea celui mai apropiat intreg, atat cand y // este pozitiv, cat si cand el este negativ itoa(c, inNouaBaza, 8); cout << "Numarul obtinut prin rotunjire, convertit in baza 8 este : " << inNouaBaza << endl; // Functia 'strtol' (string to long integer) e folosita pentru a // converti date de tip string in intreg si are sintaxa: // long strtol(const char *restrict str, char **restrict end, int // base); // argumentul 'str' identifica un string, reprezentat de un sir de // caractere ce reprezinta intregi cu semn // argumentul 'base' indica baza ce va fi folosita si ia valori de la 2 // la 36 // rezultatul este directionat catre variabila 'end' // Similar, avem functia 'strtod' (string to double), cu sintaxa: // double strtod (const char * str, char ** endptr); d1=strtol(nrBazeDiferite,&pEnd,10); d2=strtol(pEnd,&pEnd,16); d3=strtol(pEnd,&pEnd,2); d4=strtol(pEnd,NULL,0); cout << "Conversia numerelor :" << endl; cout << nrBazeDiferite << endl; cout << "in baza 10 este : " << endl; cout << d1 << " " << d2 << " " << d3 << " " << d4 << endl; }

Proiecte:
1. S se elaboreze un program care convertete un numr din baza 10 n baza 2 folosind schema lui Horner. 2. S se citeasc de la tastatur, sub forma unui vector sau a unui ir de caractere un numr binar i s se converteasc ntr-o nou baz, citit de la tastatur. 3. S se elaboreze un program care convertete un numr real din baza 10 n baza 16, utiliznd conversia separat a prii ntregi i a celei zecimale.