Baze de numerație

Bază~14 min3 pași

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
În baza 10 valorile de loc sunt puteri ale lui 10: 2·100 + 3·10 + 4·1 = 234.

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ăNumeCifre folosite
2binar0, 1
8octal0 … 7
10zecimal0 … 9
16hexazecimal0 … 9, A … F
Observația-cheie

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
1011 în baza 2 = 1·8 + 0·4 + 1·2 + 1·1 = 11 în baza 10.

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șeli frecvente

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ă b folosește cifrele 0 … b−1, iar fiecare poziție are valoarea de loc bᵖᵒᶻⁱᵗⁱᵉ, începând de la b⁰ = 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.

Întrebarea 1 / 3

Ce valoare în baza 10 are numărul 1011 scris în baza 2?