Sunteți pe pagina 1din 6

Tipuri de date şi baze de numeraţie

Algoritmică şi programare – Laborator

Tabelul următor prezintă echivalenţele între sistemele binar,


hexazecimal şi zecimal, urmând numere de 8 cifre binare, numite octeţi 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 adunării a două cifre binare este următoarea:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (cu "depăşire")

Ultimul rând de mai sus se citeşte: "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 <== valoarea lui A este 13(10) (1 + 4 + 8)


+B 1 0 1 0 1 <== valoarea lui B este 21(10) (1 + 4 + 16)
----------------
=S 1 0 0 0 1 0 <== valoarea sumei este 34(10) (2 + 32).

 
Scăderea
Scăderea în sistemul binar funcţionează foarte asemănător cu adunarea
binară. Tabla scăderii este:

0 - 0 = 0
0 - 1 = 1 (cu "împrumut")
1 - 0 = 1
1 - 1 = 0

Pe această bază se pot scădea numere binare formate din mai multe 0-uri şi 1-
uri. Operaţia se execută poziţie cu poziţie, de la dreapta la stânga. La
nevoie se foloseşte "împrumutul" de la poziţia de mai la stânga. De exemplu:

* * * <== coloanele marcate cu steluţe se folosesc pentru


împrumut
A 1 1 0 0 1 0 1 <== A are valoarea zecimală 1 + 4 + 32 + 64 = 101(10)
−B 1 1 0 1 1 <== B are valoarea zecimală 1 + 2 + 8 + 16 = 27(10)
------------------
=D 1 0 0 1 0 1 0 <== diferenţa lor este D = 2 + 8 + 64 = 74(10)

Scăderea unui număr binar produce acelaşi rezultat cu adăugarea aceluiaşi


număr dar cu semn schimbat.
Înmulţirea
Înmulţirea (multiplicarea) în binar se bazează, la fel ca şi în
sistemul zecimal, pe adunare. Tabla înmulţirii binare este:

0 x 0 = 0
0 x 1 = 0
1 x 0 = 0
1 x 1 = 1

Pentru a multiplica numerele binare A şi B se fac întâi produsele parţiale


ale lui A cu fiecare cifră binară a lui B, luate de la dreapta la stânga, şi
apoi se adună rezultatele parţiale între ele. Produsele parţiale ale fiecărei
cifre din B cu A sunt:

Dacă cifra din B este un 0, atunci şi produsul parţial este 0, şi nu


are efect asupra adunării;
Dacă cifra din B este un 1, atunci produsul parţial al lui A cu 1 este
chiar A.
Exemplu 1010(2) x 11011(2):

1 1 0 1 1 <== A este egal cu 1 + 2 + 8 + 16 = 27(10)


× 1 0 1 0 <== B este egal cu 2 + 8 = 10(10)
---------
0 0 0 0 0
+ 1 1 0 1 1

 
+ 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)
* * * * <== depăşire (la adunare)

Conversia din zecimal în binar


Se împarte numărul ales la 2; restul reprezintă cifra cea mai puţin
semnificativă (cea mai din dreapta) a rezultatului conversiei. Câtul se
reîmparte la 2, se notează restul, şi procedura se repetă cu noul cât
(recursiv). Operaţia se sfârşeşte când câtul devine nul. (Schema lui Horner)
Această metodă se poate aplica şi la conversiunea în alte baze.
Exemplu: Să se convertească numărul 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 biţi, începînd cu 0000 şi sfârşind cu 1111. Transformarea unui număr
binar într-unul hexazecimal se face prin gruparea biţilor în grupe de câte 4
biţi, de la dreapta la stînga.
Exemplu:

110110110111001(2) = (0)110 1101 1011 1001 = 6DB9(16).

Transformarea inversă, din hex în bin, se face prin înlocuirea fiecărei cifre
hex prin combinaţia corepunzătoare de 4 biţi.

Pentru conversia unui număr real din baza 10 în baza 16, se analizează
separat partea întreagă şi partea zecimală.
Exemplu:

Numărul în baza 10 este: 123,14.


Pentru conversia părţii intregi 123(10) obţinem:
123=16*7+11 -> restul 11, adică B(16)
7=16*0+7 -> restul 7, adică 7(16). Găsim că 123(10)=7B(16).
Pentru conversia părţii zecimale 0.14(10) procedăm astfel:
0.14*16=2.24 -> păstrăm 2, care devine prima cifră după virgulă în baza 16
0.24*16=3.84 -> păstrăm 3, care devine a doua cifră după virgulă în baza 16
0.84*16=13.44 -> păstrăm 13, adică D, care devine a 3-a cifră după virgulă
0.44*16=7.04 -> păstrăm 7, care devine a 4-a cifră după virgulă în baza 16
s.a.m.d.
Obţinem: 0.14(10) = 0,23D7...(16)

 
Procesul continuă până când partea fracţionară 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 converteşte un număr 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 număr binar şi să se convertească într-o nouă bază, citită
de la tastatură.
3. Să se elaboreze un program care converteşte un număr real din baza 10
în baza 16, utilizând conversia separată a părţii întregi şi a celei
zecimale.

S-ar putea să vă placă și