De ce contează?
45 de lei rămân 45 de lei, fie că-i ai într-o bancnotă de 45 (dacă ar exista), fie în 45 de monede de 1 leu, fie în câteva monede mari și câteva mici. Suma nu se schimbă — doar felul în care o „scrii" cu monedele pe care le ai. Reprezentarea unui număr în baze diferite e exact asta: aceeași valoare, alte simboluri.
Aceeași valoare, scrieri diferite
Un număr are o singură valoare, dar nenumărate reprezentări, câte una pentru fiecare bază. Iată valoarea 45 scrisă în trei baze:
| Bază | Reprezentarea lui 45 |
|---|---|
| 10 (zecimal) | 45 |
| 2 (binar) | 101101 |
| 16 (hexazecimal) | 2D |
| cifra | 2 | D |
| valoare loc | 16 | 1 |
Observă cum baza mai mare folosește mai puține cifre: 45 cere 6 cifre binare, dar doar 2 cifre hexazecimale. Cu cât baza e mai mare, cu atât fiecare poziție „duce" mai multă valoare.
Câte cifre are un număr într-o bază
Numărul de cifre necesare pentru valoarea n în baza b este ⌊log_b n⌋ + 1. Intuitiv: fiecare cifră nouă permite valori de b ori mai mari, deci numărul de cifre crește logaritmic, nu liniar.
Legătura specială dintre baza 2 și baza 16: o cifră hexazecimală = exact 4 biți (pentru că 16 = 2⁴). De aceea programatorii scriu valori pe biți în hexazecimal — e mult mai scurt și se traduce direct în binar, grup cu grup.
Implementare C++ — scrierea într-o bază oarecare
Funcția de mai jos scrie un număr în orice bază până la 16, folosind cifre 0–9 și litere A–F:
#include <iostream>
using namespace std;
void scrieInBaza(int n, int b) {
if (n == 0) { // tratam separat cazul zero
cout << 0;
return;
}
char cifre[40];
int k = 0;
while (n > 0) {
int r = n % b;
// cifrele 0-9 raman cifre, 10-15 devin litere A-F
cifre[k++] = (r < 10) ? ('0' + r) : ('A' + r - 10);
n /= b;
}
for (int i = k - 1; i >= 0; i--) cout << cifre[i]; // ordine inversa
}
int main() {
scrieInBaza(45, 2); cout << "\n"; // 101101
scrieInBaza(45, 16); cout << "\n"; // 2D
return 0;
}Trucul (r < 10) ? ('0' + r) : ('A' + r - 10) folosește aritmetica pe caractere: pentru rest 13 obții 'A' + 3 = 'D'.
Reprezentarea cu lățime fixă
Uneori vrei un număr fix de cifre, completând cu zerouri la stânga — de exemplu un octet scris pe 8 biți: 13 devine 00001101. Zerourile din față nu schimbă valoarea, doar aliniază reprezentarea.
Complexitate
Scrierea unei valori n în baza b costă O(log_b n) — adică numărul de cifre produse. Conversia e proporțională cu câte cifre are rezultatul, nu cu mărimea numărului în sine.
Greșeala 1 — crezi că valoarea s-a schimbat: 101101 și 45 și 2D sunt același număr. Doar reprezentarea diferă; nu compara reprezentări din baze diferite ca șiruri.
Greșeala 2 — afișezi resturile ≥ 10 ca numere: în baza 16, un rest de 13 trebuie scris D, nu 13. Altfel reprezentarea devine ambiguă.
Greșeala 3 — uiți zerourile la lățime fixă: dacă o problemă cere exact 8 biți, 1101 e greșit — corect e 00001101. Zerourile din față contează la afișare, deși nu la valoare.
Greșeala 4 — confunzi numărul de cifre cu valoarea: un număr mare în baza 2 are multe cifre, dar asta nu-l face „mai mare" decât reprezentarea lui scurtă din baza 16. Compari valori, nu lungimi de scriere.
Recapitulare
- Un număr are o singură valoare, dar o reprezentare diferită în fiecare bază; bazele mari folosesc mai puține cifre.
- O cifră hexazecimală corespunde exact la 4 biți (16 = 2⁴), motiv pentru care hexazecimalul e folosit ca scurtătură pentru binar.
- Scrierea într-o bază costă O(log_b n); atenție la literele A–F pentru cifre ≥ 10 și la zerourile din față când se cere o lățime fixă.