De ce contează?
Te uiți la un ceas: 1 oră înseamnă 60 de minute, iar 1 minut înseamnă 60 de secunde. Fără să-ți dai seama, folosești deja un sistem cu „baza 60". Tot timpul grupăm lucruri în pachete: zeci, duzini, ore. O bază de numerație e doar regula după care decidem cât de mare e un „pachet".
Ce este o bază de numerație
Sistemul nostru obișnuit e pozițional în baza 10: aceeași cifră înseamnă altceva în funcție de locul ei. În 234, cifra 2 valorează 200, nu 2, pentru că stă pe poziția sutelor.
| cifra | 2 | 3 | 4 |
| valoare loc | 100 | 10 | 1 |
Ideea se generalizează la orice bază b: folosești cifrele 0 … b−1, iar fiecare poziție are valoarea de loc bᵖᵒᶻⁱᵗⁱᵉ — adică b⁰ = 1, b¹ = b, b² = b·b, și așa mai departe, de la dreapta la stânga.
| Bază | Nume | Cifre folosite |
|---|---|---|
| 2 | binar | 0, 1 |
| 8 | octal | 0 … 7 |
| 10 | zecimal | 0 … 9 |
| 16 | hexazecimal | 0 … 9, A … F |
Calculatorul lucrează intern în baza 2: fiecare bit e o poziție cu cifra 0 sau 1. De aceea bazele 2, 8 și 16 apar peste tot în informatică — sunt „limba" naturală a memoriei.
Cum afli valoarea unui număr dintr-o bază
Un număr în baza 2 se citește la fel ca în baza 10, doar că valorile de loc sunt puteri ale lui 2:
| cifra | 1 | 0 | 1 | 1 |
| valoare loc | 8 | 4 | 2 | 1 |
Aduni valorile de loc unde cifra e 1 (sau, în general, înmulțești fiecare cifră cu valoarea ei de loc și aduni tot).
Implementare C++
Calculezi valoarea folosind schema lui Horner: pleci de la 0 și, pentru fiecare cifră de la stânga la dreapta, înmulțești ce ai cu baza și adaugi cifra nouă. Asta evită calcularea explicită a puterilor.
#include <iostream>
using namespace std;
int main() {
int b = 2;
int cifre[] = {1, 0, 1, 1}; // 1011 in baza 2, de la stanga
int n = 4;
int valoare = 0;
for (int i = 0; i < n; i++) {
valoare = valoare * b + cifre[i]; // schema lui Horner
}
cout << valoare << "\n"; // 11
return 0;
}De ce funcționează Horner: la fiecare pas, înmulțirea cu b „împinge" cifrele de până acum cu o poziție mai sus, exact ca atunci când adaugi o cifră la dreapta unui număr.
Complexitate
Citirea unui număr cu k cifre costă O(k) — o singură trecere prin cifre. Numărul de cifre necesare pentru o valoare n în baza b este aproximativ log_b n, deci bazele mari (16) folosesc mai puține cifre decât bazele mici (2) pentru aceeași valoare.
Greșeala 1 — cifră ≥ bază: în baza 2 nu există cifra 2, în baza 8 nu există 9. O cifră trebuie să fie mereu strict mai mică decât baza.
Greșeala 2 — confunzi ordinea pozițiilor: valoarea de loc 1 (b⁰) e la dreapta, nu la stânga. Dacă citești puterile invers, obții un alt număr.
Greșeala 3 — uiți literele în baza 16: după cifra 9 urmează A=10, B=11, …, F=15. 1F în baza 16 nu e o eroare, ci 1·16 + 15 = 31.
Greșeala 4 — 0⁰ greșit: b⁰ este 1 pentru orice bază, inclusiv valoarea de loc a unităților. Nu confunda poziția 0 cu valoarea 0.
Recapitulare
- O bază
bfolosește cifrele0 … b−1, iar fiecare poziție are valoarea de locbᵖᵒᶻⁱᵗⁱᵉ, începând de lab⁰ = 1în dreapta. - Valoarea unui număr = suma fiecărei cifre înmulțite cu valoarea ei de loc; o calculezi rapid cu schema lui Horner în O(k).
- Bazele 2, 8 și 16 sunt esențiale în informatică pentru că reflectă felul în care memoria stochează datele în biți.