Sunteți pe pagina 1din 6

Baze de numeraţie

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).

1
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
2
-----------------
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)

3
Probleme propuse:

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 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.

Algoritmi de interschimbare a valorilor a două variabile

Interschimbarea valorilor a două variabile de memorie x şi y nu se face


prin simpla atribuire a noii valori, deoarece secvenţa de atribuiri x<-y şi
y<-x ar duce la pierderea valorii lui x, iar secvenţa y<-x şi x<-y ar
duce la pierderea valorii lui y.
Pentru a realiza interschimbarea conţinutului celor două variabile de
memorie se poate folosi una din următoarele variante de algoritm:

Varianta 1. Interschimbarea valorilor a două variabile a şi b prin folosirea


unei variabile intermediare x. Paşii algoritmului sunt:
1. Se salvează valoarea primei variabile a în variabila x;
2. Se atribuie primei variabile valoarea celei de a doua variabile;
3. Se atribuie celei de a doua variabile b valoarea care a fost salvată în
a treia variabilă x.

Exemplu. Se citesc două variabile de la tastatură. Să se interschimbe


conţinutul lor şi să se afişeze apoi pe ecran.

#include<iostream>
using namespace std;
void main()
{
int a, b, x;
cout<<"Introduceti a : "; cin>>a;
cout<<"Introduceti b : "; cin>>b;
x=a; a=b; b=x ;
cout<<"Valoarea lui a devine : "<<a<<endl;
cout<<"Valoarea lui b devine : "<<b<<endl;
}

Varianta 2. Interschimbarea valorilor a două variabile a şi b fără folosirea


unei variabile intermediare. Se folosesc identităţile matematice:
a=(a-b)+b şi b=((a-b)+b)-(a-b)

#include<iostream>
using namespace std;
void main()
{
int a,b;
cout<<"Introduceti a : "; cin>>a;
cout<<"Introduceti b : "; cin>>b;
a=a-b;
b=a+b;
4
a=b-a;
cout<<"Valoarea lui a devine : "<<a<<endl;
cout<<"Valoarea lui b devine : "<<b<<endl;
}

***************************

Următorul algoritm calculează cel mai mare divizor comun şi cel mai mic
multiplu comun a două numere naturale, nenule, a şi b, citite de la
tastatură. Algoritmul are două variante: prin împărţiri repetate şi prin
scăderi repetate.

Varianta 1. Se foloseşte algoritmul lui Euclid, care atribuie lui b restul


împărţirii lui a la b, iar lui a vechea valoare a lui b. Algoritmul se
încheie când b=0.

Paşii algoritmului sunt:


1. Se împarte a la b şi se obţine restul r;
2. Se execută operaţiile de atribuire a<-b şi b<-r;
3. Dacă b este diferit de 0 atunci se revine la pasul 1, altfel c.m.m.d.c.
este a.

#include<iostream>
using namespace std;
void main()
{
int a, b, r, x, y;
cout << "Programul calculeaza c.m.m.d.c. si c.m.m.m.c a doua numere
date" << endl;
cout << "Introduceti primul numar : ";
cin >> a; x=a;
cout << "Introduceti al doilea numar : ";
cin >> b; y=b;
while(b!=0) {
r=a%b; // calculeaza restul impartirii lui a la b
a=b;
b=r;
}
cout << "c.m.m.d.c al numerelor "<< x << " si " << y << " este : " << a
<< endl;
cout << "c.m.m.m.c al numerelor "<< x << " si " << y << " este : " <<
x*y/a << endl;
}

Varianta 2. Folosim algoritmul de scădere repetată a valorii celei mai mici


din valoarea cea mai mare. Rezolvarea problemei se bazează pe condiţia a≠b.

Paşii algoritmului sunt:


1. Se scade din numărul mai mare numărul mai mic;
2. Dacă numerele sunt diferite se revine la pasul 1, altfel c.m.m.d.c.
este a.

#include<iostream>
using namespace std;

5
void main()
{
int a, b, x, y;
cout << "Programul calculeaza c.m.m.d.c. si c.m.m.m.c a doua numere
date" << endl;
cout << "Introduceti primul numar : ";
cin >> a; x=a;
cout << "Introduceti al doilea numar : ";
cin >> b; y=b;
while (a!=b) {
if(a>b)
a=a-b;
else
b=b-a;
}
cout << "c.m.m.d.c al numerelor "<< x << " si " << y << " este : " << a
<< endl;
cout << "c.m.m.m.c al numerelor "<< x << " si " << y << " este : " <<
x*y/a << endl;
}

Observaţie. Pentru numerele naturale considerate a şi b are loc următoarea


relaţie:
a*b=c.m.m.d.c.(a,b)*c.m.m.m.c.(a,b),

formulă ce permite astfel determinarea şi a celui mai mic multiplu comun a


acestor două numere.

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