Sumatorul
Adunarea în binar urmează exact aceleași reguli ca adunarea în coloană pe care am învățat-o în școala primară, doar că folosim două cifre în loc de zece. Regulile încap firesc într-un tabel de adevăr, iar de acolo, folosind porțile din lecția precedentă, se preschimbă într-un circuit viu. Este primul pas cu adevărat util prin care simplele comutatoare electrice încep să socotească.
Termeni: transport semisumator SAU-EXCLUSIV sumator complet transport succesiv complement față de doi depășire
Adunarea în coloană
Gândiți-vă cum adunăm două numere mari pe o foaie de hârtie: le așezăm frumos unul sub altul, aliniate la dreapta, și adunăm cifră cu cifră, pornind de la unități spre stânga. Când suma unei coloane depășește o singură cifră — de pildă 7 + 5 = 12 —, scriem unitățile jos (2) și „ținem minte” cifra zecilor (1), pe care o trecem mai departe ca transport la coloana vecină. Suntem atât de obișnuiți cu acest dans al creionului pe hârtie încât îi uităm natura profundă: este un algoritm mecanic infailibil, probabil cel dintâi pe care l-am deprins în copilărie.
În lumea binară, regulile sunt aceleași, însă considerabil mai simple, fiindcă nu avem la dispoziție decât două cifre: 0 și 1. Situațiile posibile pot fi numărate pe degete. 0 plus 0 dă 0. 0 plus 1 dă 1. Iar 1 plus 1 dă 2. Dar cum numărul doi nu poate fi scris cu o singură cifră binară, el devine 10: scriem 0 în coloana curentă și trimitem 1 ca transport în coloana din stânga. Dacă se întâlnesc trei de 1 (doi adunați plus un transport venit de dinainte), obținem 3, adică 11 binar: scriem 1 și trecem 1 mai departe. Întreaga aritmetică a adunării încape în aceste câteva reguli clare, iar această simplitate este exact ceea ce face posibilă construirea ei din circuite electrice.
Semisumatorul
Să privim mai întâi cea mai simplă coloană posibilă: prima din dreapta, coloana unităților, care nu primește niciun transport din urmă. Ea are nevoie de două intrări (cei doi biți de adunat) și oferă două ieșiri: cifra care rămâne pe loc (suma) și cifra care pleacă spre stânga (transportul). Circuitul capabil să facă această operație se numește semisumator — „semi” pentru că este pregătit să rezolve doar o jumătate de problemă, lipsindu-i o a treia intrare pentru un eventual transport primit.
Dacă analizăm ieșirile, recunoaștem imediat porțile logice: transportul trebuie să fie 1 numai atunci când ambele intrări sunt 1 (adică 1 + 1 = 10), ceea ce corespunde perfect porții ȘI. Cifra sumei este 1 atunci când exact una dintre intrări este 1 (0+1 sau 1+0), dar devine 0 când ambele sunt 1 (caz în care suma este 10, deci unitatea e 0). Această comportare poartă numele de SAU-EXCLUSIV (deseori prescurtat XOR): adică „fie una, fie cealaltă, dar niciodată amândouă deodată”.
Poarta SAU-EXCLUSIV nu este o piesă exotică de sine stătătoare: ea poate fi asamblată ușor din porțile ȘI, SAU și NU pe care le știm deja: (a SAU b) ȘI NU (a ȘI b). Fiind însă omniprezentă în aritmetică și criptografie, inginerii îi dau un simbol grafic propriu.
Sumatorul complet
Toate celelalte coloane ale unui număr, aflate la stânga primei poziții, sunt mai exigente: ele trebuie să adune nu doar cei doi biți proprii (a și b), ci și transportul sosit de la coloana vecină din dreapta. Avem așadar trei intrări de adunat. Circuitul care rezolvă această sarcină întreagă se numește sumator complet.
Privit logic, răspunsul este armonios: cifra sumei trebuie să fie 1 atunci când avem un număr impar de intrări egale cu 1 (un singur 1 sau toți trei de 1). Transportul care pleacă mai departe trebuie să fie 1 dacă cel puțin două intrări din cele trei sunt active. Sunt exact funcțiile de „paritate” și „majoritate” pe care le-am observat în exercițiile din lecția trecută. Nu trebuie să inventăm nimic din neant: logica pură se mulează pe aritmetică.
În practică, un sumator complet este construit elegant prin înlănțuirea a două semisumatoare: primul adună a cu b, iar cel de-al doilea adaugă transportul venit din dreapta la rezultatul parțial. Dacă oricare dintre aceste două adunări produce un transport (nu se poate întâmpla la ambele deodată), un simplu SAU trimite acel transport către coloana următoare.
Legarea în lanț
Un sumator complet se ocupă de o singură coloană. Dacă așezăm opt asemenea blocuri unul lângă altul și conectăm transportul ieșit din fiecare la intrarea vecinului din stânga, obținem un dispozitiv capabil să adune două numere de câte opt biți (adică doi octeți). Această configurație poartă numele de transport succesiv — este întruparea fizică, în siliciu și cupru, a adunării pe hârtie din școală.
Priviți însă ce constrângere ascunsă apare aici: coloana a doua nu își poate cunoaște rezultatul final până când prima coloană nu termină de calculat transportul; coloana a treia trebuie să o aștepte pe a doua, și tot așa, ca un șir de piese de domino care cad una după alta. Pentru numere mari, de 64 de biți, această undă de așteptare ar fi mult prea lentă. În procesoarele reale, inginerii folosesc scheme ingenioase de „anticipare a transportului”, care ghicesc transporturile tuturor coloanelor în paralel, sacrificând spațiu pe cip (mai multe tranzistoare) pentru a câștiga viteză. Este primul exemplu dintr-un compromis etern în calculatoare: schimbul între timp și spațiu.
Scăderea, cu același circuit
Am putea crede că pentru a scădea numere avem nevoie de un circuit complet diferit. Din fericire, matematica ne oferă o scăpare sclipitoare: scăderea poate fi transformată într-o adunare! Gândiți-vă la un cadran de ceas cu 12 ore: dacă este ora 9 și vreți să aflați ce oră a fost acum 3 ore, puteți da limba înapoi cu 3 ore, ajungând la ora 6. Dar puteți la fel de bine să dați limba înainte cu 9 ore (fiindcă 12 − 3 = 9) și veți ajunge exact în același punct, la ora 6! Într-un sistem circular, a scădea o valoare este identic cu a adăuga diferența până la capătul ciclului.
Pe opt biți putem reprezenta 256 de valori diferite (de la 0 la 255). A scădea un număr este așadar echivalent cu a adăuga ceea ce îi lipsește până la 256. Acest număr complementar se obține uimitor de ușor în binar: inversăm pur și simplu toți biții (0 devine 1, iar 1 devine 0) și adunăm 1 la sfârșit. Tehnica se numește complement față de doi. Cu această convenție simplă, numerele care încep cu 1 sunt interpretate ca negative, permițându-ne să acoperim intervalul de la −128 până la +127 fără să fie nevoie de vreun semn fizic de minus în fire.
Sumatorul nostru poate acum să scadă fără nicio piesă nouă: când vrem scădere, inversăm biții celui de-al doilea termen prin simple porți NU și injectăm un 1 la transportul inițial al primei coloane. Apăsați pe butonul „scădere” din figura de mai sus: circuitul rămâne neschimbat, dar calculează scăderi perfecte!
Depășirea
Opt biți oferă exact 256 de combinații posibile și niciuna în plus. Când adunăm două numere mari și rezultatul depășește 255, cel de-al nouălea bit — transportul ieșit din ultima coloană din stânga — pur și simplu nu mai are loc în octet și cade în gol, asemenea kilometrajului unei mașini care se resetează la 00000 după 99999. Această situație poartă numele de depășire (overflow). Ea nu reprezintă un defect de fabricație, ci o consecință inevitabilă a faptului că lucrăm cu o lățime fixă de biți. La marginea oricărui sistem finit, aritmetica se curbează în cerc.
Procesoarele nu ignoră însă acest eveniment: ele prind bitul căzut într-un indicator special (un „flag”), pe care programatorul îl poate inspecta. În funcție de intenție, depășirea poate semnala o eroare gravă sau poate fi folosită deliberat, exact ca rotirea unui ceasornic.
Sumatorul pe care l-am construit socotește cu viteza luminii, dar suferă de o slăbiciune majoră: este complet lipsit de memorie. Dacă îi întrerupem intrările, rezultatul de la ieșire se evaporă într-o clipă. Circuitele de până acum trăiesc exclusiv în prezentul imediat, fără nicio amintire a trecutului. Pentru a construi un calculator adevărat, avem neapărat nevoie de circuite capabile să țină minte un rezultat chiar și după ce cauza care l-a produs a dispărut. În lecția următoare vom da viață memoriei printr-o idee surprinzătoare: o buclă în care ieșirea unui circuit se întoarce la propria sa intrare.