# Wiskunde/Talstelsels

Hoofdstukken :
Algebra
Getallen
Meetkunde
Oppervlakte
Pythagoras
Rekenkunde
Talstelsels
Vergelijkingen en ongelijkheden
Volume :

## Inleiding

Welke van de volgende rekensommen zijn juist?
Mocht je dit voorleggen aan een willekeurig persoon, dan bestaat de kans dat hij of zij zal aangeven dat enkel de derde juist is. Nochtans kunnen ze allemaal juist zijn, mits voldoende uitleg gegeven wordt over het soort talstelsel dat gebruikt wordt. In onze (westerse) wereld werken wij echter graag met machten van tien, in ons decimaal talstelsel. Het is ook logisch, want we hebben tien vingers.
Zonder het te weten, gebruik je standaard al een talstelsel bij het rekenen: het decimale talstelsel. Maar hoe zit het dan met de andere talstelsels? Dit stuk gaat over het gebruik van verschillende positiestelsels en hoe je kunt omrekenen van het ene naar het andere. Het gaat dus niet over Romeinse cijfers, uren of hoeken. Uren en hoeken gaan zelfs niet zozeer over talstelsels, maar over modulair rekenen (noodzakelijk bij bv. RSA en cryptografie). Voor de toepassingen van talstelsels in de informatica is een apart Wikibook voorzien.

## Leesbaarheidsregels

Om in dit hoofdstuk geen verwarring te krijgen tussen de verschillende talstelsels, worden alle getallen op de plek waar het niet uit de context opgemaakt kan worden, gevolgd door het grondtal van hun talstelsel tussen. Zo staat 10$_{(10)}$ voor het getal 10 in het decimale stelsel en 10$_{(2)}$ voor het getal 2 (eigenlijk: 2$_{(10)}$), weergegeven in het binaire stelsel. In het hexadecimale stelsel is het getal 10 (10$_{(16)}$) het getal 16 in het decimale stelsel (16$_{(10)}$).
Verder is het gebruikelijk om, wanneer je een getal binair opschrijft, de cijfers te groeperen per 4 of per 8, om de leesbaarheid te bevorderen. In dit hoofdstuk worden ze gegroepeerd per 4.

## Voorbeelden

Hoe "werkt" zo'n positiestelsel precies? Hoeveel kruisjes staan hier: XXXX? Dat zijn er vier. Normaal zal men dit aantal noteren als 4. Ook een IT'er die het hexadecimale stelsel gebruikt, schrijft voor dit aantal 4. Een computer daarentegen noteert in het binaire stelsel het aantal vier als 100? Het volgende aantal kruisjes, XXXXXXXXXXXXXXXX, is zestien. Dit aantal schrijft men gewoonlijk als 16, een IT'er in het hexadecimale stelsel echter als 10 en een computer schrijft 10000 in het binaire stelsel. Laten we dit eens bekijken aan de hand van enkele voorbeelden, om dan de algemene regels te presenteren.

### Het decimale talstelsel

Het decimale talstelsel is het meest gebruikte talstelsel. Dit talstelsel gebruikt tien (deca = tien) cijfers. Deze zijn:
    0 1 2 3 4 5 6 7 8 9
Iedereen zal hieronder drieëntwintig kruisjes zien staan, genoteerd als 23. Een computer schrijft in het binaire stelsel hiervoor 10111.
Dat er 23 kruisjes staan, is gewoon een kwestie van tellen. Maar waarom schrijft men hiervoor in het decimale stelsel 23? Tijd dus voor een uitgebreide uitleg. Het tellen gebeurt zoals in een "ouderwetse" kilometerteller in de wagen of met een ouderwets kliksysteem zoals voor het tellen van bv. het aantal personen die ergens passeren:
* Een decimale teller, waar je de volgende en de vorige cijfers ziet.
* Een decimale handteller
* Een telraam met het getal 1981.
Het telraam telt maar 100 kralen, maar toch kan men veel grotere getallen voorstellen. Dan wordt de eerste rij gebruikt voor het tellen van eenheden, de tweede rij voor tientallen, de derde rij voor honderdtallen,... Het getal op het telraam is dan niet 19, maar 1981.
Laten we de eerste negen kruisjes tellen.
Telvoorbeeld:
Tot nu toe kunnen we de aantallen kruisjes met één symbool (cijfer) aangeven. Maar bij de volgende zitten we met een probleem: in het decimale talstelsel hebben we namelijk niet één symbool om het volgende kruisje voor te stellen. We weten echter dat we verder kunnen tellen met:
De reden dat dit "werkt" is omdat het decimaal talstelsel een positiestelsel is. Zo zijn 12 en 21 opgebouwd uit dezelfde cijfers - nl. '1' en '2' - maar zijn 12 en 21 toch niet dezelfde getallen. De '1' bij 12 is een tiental, wat betekent dat we al één groep van 10 kruisjes hebben. Bij '21' is het tiental een '2', wat betekent dat we al twee groepen van 10 kruisjes hebben.
Als we bij ons voorbeeld 19 één kruisje erbij plaatsen, hebben we een extra groep van tien kruisjes, bij de groep die we al hadden. We hebben dus twee groepen van tien kruisjes, wat we aangeven met 20. Zo kunnen we terug verder tellen:
Dit tellen kunnen we verder doen tot bv. 99, wat betekent dat we 9 groepen van 10 kruisjes en een restgroepje van 9 kruisjes hebben. Als we er nu één kruisje bijplaatsen, hebben we 10 groepen van elk 10 kruisjes. Dit stellen we dan voor door het getal 100.
Het getal 162 betekent dan 1 groep van 10 keer 10 "kruisjes" (dus 10²) , 6 groepen van 10 "kruisjes" en 1 restgroep van 2 kruisjes. Of in formulevorm:
$1\cdot 10^{2}+6\cdot 10^{1}+2\cdot 10^{0}=100+60+2=162$

### Het binaire talstelsel

Het binaire talstelsel wordt bijna niet gebruikt door de mens. De hedendaagse computers werken bijna allemaal met binaire getallen: elektriciteit of geen elektriciteit, licht of geen licht,... Dit talstelsel gebruikt slechts twee (bi = twee) cijfers:
We kunnen dezelfde methode gebruiken zoals bij het decimale talstelsel, namelijk door het tellen van kruisjes:
Je zou geneigd zijn om '2' te noteren bij XX, maar het cijfer '2' is geen geldig cijfer in het binaire talstelsel. We merken echter op dat we één groep van twee X-en hebben. Bij het tellen van XX schrijven we binair dan ook 10. Vandaar ook de uitdrukking Er zijn 10 soorten mensen: diegene die binair begrijpen en diegene die dat niet kunnen. Zo kunnen we verdertellen:
Als we nu een kruisje toevoegen t.e.m. XXXX, dan merken we dat we één groep van twee keer twee kruisjes hebben. Dit klinkt in woorden nogal ingewikkeld, maar als getal is dit het binaire getal 100:
Het binaire getal 101 betekent dan 1 groep van 2 keer 2 "kruisjes" (dus 2$^2$), 0 groepen van 2 "kruisjes" en 1 restgroep van 1 kruisje. Of in formulevorm: $1\cdot 2^{2}+0\cdot 2^{1}+1\cdot 2^{0}=4+0+1=5$. Dus 101$_{(2)}$ = 5$_{(10)}$.

### Het octale talstelsel

Het octale talstelsel wordt bijna niet meer gebruikt. Dit talstelsel gebruikt acht (octo = acht) cijfers:
Telvoorbeeld:

### Het hexadecimale talstelsel

Men zocht naar een manier om met één symbool verder te kunnen tellen dan 9. Zo besloot men voor het hexadecimale talstelsel om verder te tellen met de letters A, B, C, D, E en F. Binnen het hexadecimale talstelsel zijn de letters A t/m F dus cijfers. De volledige lijst van de 16 (hexadeca = 16) cijfers is dus (van klein naar groot):
Opnieuw kunnen we het tellen als basis gebruiken:
Nu zijn we geneigd om 10 te plaatsen bij XXXXXXXXX, maar als we hetzelfde principe gebruiken zoals bij de andere talstelsels, dan betekent de '1' van '10' dat we al één groep van 16 kruisjes hebben. De decimale 10 kunnen we hier dus niet gebruiken. Als we kijken bij de gebruikte "cijfers" van het hexadecimale talstelsel, dan merken we dat na de '9' een 'A' komt. We kunnen dus verder tellen met:
Pas nu zijn we op het moment gekomen dat we een groep van 16 kruisjes zullen kunnen maken:
Het hexadecimale getal 1A2 betekent dan 1 groep van 16 keer 16 "kruisjes" (dus 16$^2$) , 10 (=A) groepen van 16 "kruisjes" en 1 restgroep van 2 kruisjes. Of in formulevorm: $1\cdot 16^{2}+10\cdot 16^{1}+2\cdot 16^{0}=256+160+2=418$. Dus 1A2$_{(16)}$ = 418$_{(10)}$.

### Overzicht

Een overzicht van de bekendste talstelsels:

### Wat zijn talstelsels?

Een talstelsel is een systeem om getallen weer te geven in de vorm van een rij cijfers. Bij de eerder besproken talstelsels bepaalt de plaats die een cijfer in de rij inneemt hoe we de bijdrage van dat cijfer aan het getal moeten interpreteren. We spreken dan ook over positiestelsels. Alhoewel de benaming 'decimaal talstelsel' gebruikelijk is, zou 'decimaal positiestelsel' duidelijker uitleggen dat we specifiek met een positiestelsel te maken hebben.
Merk op dat alle positiestelsels talstelsels zijn, maar niet alle talstelsels zijn positiestelsels. Zo is de waarde van I in het Romeinse getal IV '1', maar zo ook in het Romeinse getal VI. Dit is niet zo voor het decimale getal 21 versus 12: bij het tweede getal heeft '1' namelijk de waarde van '10'.
Merk op:
* Er kunnen nullen vóór het daadwerkelijke getal staan zonder de waarde ervan te beïnvloeden. Zo is 1 hetzelfde als 01 en 001. Bij het decimale talstelsel is het heel ongebruikelijk om voorloopnullen te laten staan, in de andere talstelsels wordt dit soms wel gedaan (bv. bij ASCII of Wireshark).
* Alle talstelsels hebben een nul (0).
* Het grootste cijfer in een talstelsel is (grondtal - 1), omdat de nul ook meetelt als cijfer. Zo is het grootste cijfer in het decimale stelsel een 9 (decem = 10), in het octale stelsel een 7 (octo = 8) en in het binaire stelsel een 1 (bi = 2). De mogelijke cijfers komen dus altijd uit de reeks 0, 1,..., grondtal-1.

## Omrekenen

Om van het ene talstelsel om te rekenen naar het andere, zijn er een aantal methoden.

### Van een ander stelsel naar het decimale stelsel
#### Algemeen

Een natuurlijk getal x laat zich in het decimale positiestelsel uitdrukken als een reeks van termen van machten van een ander natuurlijk getal, het grondtal, a:
    $\,x=\sum _{i=0}^{k}x_{i}a^{i}$
of
    $\,x=x_{k}a^{k}+...+x_{2}a^{2}+x_{1}a^{1}+x_{0}a^{0}$
waarbij de coëfficiënten x$_i$ natuurlijke getallen zijn kleiner dan het grondtal, of nul.
In het a-tallige stelsel wordt x nu voorgesteld door de rij cijfers:
    $\,x_{k}...x_{2}x_{1}x_{0}$.
De coëfficiënten x$_i$ vormen in volgorde de cijfers van het getal. Het meest linkse cijfer x$_k$ is de coëfficiënt van de hoogste macht van het grondtal, het meest rechtse x$_0$ de coëfficiënt van de eenheden (de 0-de macht van het grondtal).
Bovenstaande formules zien er ingewikkeld uit, maar met een voorbeeld wordt alles duidelijker:
* Het decimale getal 1432 wordt met bovenstaande formule: $1\cdot 10^{3}+4\cdot 10^{2}+3\cdot 10^{1}+2\cdot 10^{0}=1000+400+30+2=1432$
* In het octale stelsel, dus met grondtal 8, gebruikt men de cijfers 0, 1, ..., 7. Het getal 1432 in het octale stelsel betekent in het decimale stelsel: $1\cdot 8^{3}+4\cdot 8^{2}+3\cdot 8^{1}+2\cdot 8^{0}=512+256+24+2=794$. Dus 1432$_{(8)}$=794$_{(10)}$.

#### 472$_{(8)}$ = ?$_{(10)}$

Als voorbeeld hier het omrekenen van het octale getal 472$_{(8)}$ naar een decimaal getal. We nemen de volgende stappen:
* Voor het bepalen van de positie tellen we vanaf 0 en niet vanaf 1.
* Bepaal voor elke positie het gewicht als het grondtal tot de macht de positie. Bij positie 2 is het gewicht dus 8$^2$=64.
* Reken voor elk cijfer de bijdrage uit door het cijfer te vermenigvuldigen met het gewicht. Bij cijfer 4 is de bijdrage dus 4 * 64 = 256.
* Tel de bijdragen van de cijfers bij elkaar op.
De uitwerking is dus als volgt: het getal is 472$_{(8)}$
    ${\begin{matrix}{\text{positie}}&{\text{gewicht}}&{\text{cijfer}}&{\text{bijdrage}}\\0&\ 1&2&\ \ 2\\1&\ 8&7&\ 56\\2&64&4&256\\&\ &{\text{totaal}}&314\end{matrix}}$
Het resultaat is :
    ${\begin{matrix}472_{(8)}&=&4*8^{2}+7*8^{1}+2*8^{0}\\&=&4*64+7*8+2*1\\&=&256+56+2\\&=&314\end{matrix}}$
Dus 472$_{(8)}$ = 314$_{(10)}$. Merk op dat in bovenstaande uitwerking alles aan de rechterkant in het decimale talstelsel wordt uitgerekend.

#### 472$_{(8)}$ = ?$_{(10)}$, met computeralgoritme

Bovenstaande methode wordt als mens vaak gebruikt, maar mocht je dit in een programma wensen te gieten, kan onderstaand recursief algoritme van pas komen:
* 'variabelen instellen
* in = inlezen getal
* grondtal = inlezen grondtal
* uit = meest linkse getal van in
* in = in, zonder meest linkse getal
* 'lus
* uit = uit * grondtal
* getal = meest linkse getal van in
* uit = uit + getal
* in = in, zonder meest linkse getal. Als 'in' niet leeg, naar stap 8
* 'antwoord
* output uit.
Voor het bovenstaande voorbeeld wordt dit:
* in = 472
* grondtal = 8
* uit = 4
* in = 72
* uit = 4 * 8 = 32
* getal = 7
* uit = 32 + 7 = 39
* in = 2
* uit = 39 * 8 = 312
* getal = 2
* uit = 312 + 2 = 314
* in = STOP
* Het antwoord is 314

### Van het decimale stelsel naar een ander stelsel

Het omrekenen van het decimale stelsel naar een ander stelsel is een stukje ingewikkelder. Het is met makkelijkst uit te leggen aan de hand van een voorbeeld.

#### 23$_{(10)}$ = ?$_{(2)}$

Vanuit het tellen weten we al dat de basis van het binaire stelsel neerkomt op het maken van groepjes van twee. Dit kunnen we makkelijkst bepalen met de Euclidische deling.
Uitleg:
* Blijkbaar kunnen we 11 groepen van 2 maken en hebben we 1 restgroep X.
* Bij de volgende stap proberen we te kijken hoeveel XX-groepjes we per twee kunnen samennemen. Blijkbaar kunnen we 10 XX-en samennemen tot 5 XXXX-en, waarbij er 1 restgroep XX is.
* Dit algoritme herhalen we: ditmaal kunnen we 4 XXXX-en samennemen tot 2 XXXXXXXX-en, met 1 restgroep XXXX.
* Bij de vierde stap kunnen we de XXXXXXXX en XXXXXXXX samennemen tot XXXXXXXXXXXXXXXX en hebben we geen restgroep.
* De vijfde stap wordt al eens over het hoofd gezien, maar we moeten blijven verderdelen tot het quotiënt 0 wordt. Daar we niets meer kunnen samennemen hebben we nu 1 restgroep XXXXXXXXXXXXXXXX.
* Voor het bepalen van het antwoord moeten we van beneden naar boven lezen en krijgen we: 23$_{(10)}$=10111$_{(2)}$

#### 1203$_{(10)}$ = ?$_{(16)}$

Stel, we willen 1203$_{(10)}$ omzetten naar hexadecimaal. Hiervoor kunnen we hetzelfde algoritme gebruiken als het vorige voorbeeld. Het enige verschil is dat het grondtal (deler) ditmaal 16 is, maar ook hier blijven we delen tot we als quotiënt 0 uitkomen. De kruisjes worden deze keer achterwege gelaten, omdat er teveel zijn:
Merk op:
* Delen door 2 kunnen we gemakkelijk uit het hoofd, maar delen door 16 is moeilijker. Een klassiek rekentoestel kan een hulpmiddel zijn, maar rekent meestal niet Euclidisch. Toch kan je snel rekenen met: 1203 / 16 = 75,1875 ==> 75,1875 - 75 = 0,1875 ==> 0,1875 * 16 = 3.
* Opnieuw moet je van beneden naar boven aflezen, maar 4113 zou een fout antwoord zijn, want 4113$_{(16)}$ = 16659$_{(10)}$. De '11' moeten we namelijk eerst omzetten naar een hexadecimaal "cijfer": 11$_{(10)}$ == B$_{(16)}$.
* Het antwoord wordt dan: 1203$_{(10)}$ == 4B3$_{(16)}$

### Shortcuts

Om van het ene stelsel naar het andere om te rekenen, wordt vaak als tussenkomst het decimale stelsel gebruikt. Wil men van octaal naar hexadecimaal, dan is het vaak octaal -> decimaal -> hexadecimaal. Dit vergroot de kans op rekenfouten aanzienlijk. Er zijn echter handigheidjes om van binair naar hexadecimaal om te rekenen (en vice versa) of van binair naar octaal om te rekenen (en vice versa).
De truc zit er hem in, dat een groep van 4 cijfers in het binaire stelsel, precies één cijfer in het hexadecimale stelsel heeft. Of dat een groep van 3 cijfers in het binaire stelsel, precies één cijfer in het octale stelsel heeft Zolang je onderstaande tabel in gedachten houdt, kun je elke kant op omrekenen.

#### Hexadecimaal <-> binair

Wil je weten wat 30F2$_{(16)}$ is in binair? Neem elk getal apart en schrijf deze op:
Conclusie: 30F2$_{(16)}$ = 0011 0000 1111 0010$_{(2)}$.
De andere kant op werkt net zo gemakkelijk. Wil je weten wat 11000011110010$_{(2)}$ is in hexadecimaal?
Groepeer eerst het binaire getal per 4 cijfers, beginnend aan de rechterkant.
Is er op het eind geen groep van 4, dan kun je hier nullen aan toevoegen.
Nu kun je per groep kijken welke cijfer er bij hoort
Conclusie: 11000011110010$_{(2)}$ = 30F2$_{(16)}$.

#### Octaal <-> binair

De omzetting octaal naar binair (en omgekeerd) is net zo gemakkelijk. Binnen deze cursus gaan we daar niet verder op in.

#### Decimaal <-> binair

De "shortcut" omzetting van decimaal naar binair lukt niet! Dit omdat het grondtal 10 geen macht is van twee. Om één decimaal cijfer voor te stellen zijn 3 bits namelijk te weinig (daar kan je maximaal 7 en niet 9 mee voorstellen) en zijn 4 bits te veel (daar kan je maximaal niet 9 mee voorstellen, maar 15).
Als je het toch probeert, krijg je fouten. Zo zou 74$_{(10)}$ met een shortcutomzetting waar vier bits worden gebruikt 0111 0100$_{(2)}$ = 01110100$_{(2)}$ worden, maar dat binaire getal is 116$_{(10)}$ (te bepalen via de somregel). Het juiste antwoord is 74$_{(10)}$=1001010$_{(2)}$ (te bepalen via de Euclidische deling)!
Conclusie: de omzetting decimaal <-> binair mag NIET via een shortcut!

### Samenvatting

Voor het omrekenen tussen talstelsels zijn de volgende methoden gezien:
* (...)$_?$ -> (...)$_{10}$: de somregel
* (...)$_{10}$ -> (...)$_?$: de Euclidische deling
* (...)$_{16}$ <-> (...)$_2$: shortcut
* (...)$_8$ <-> (...)$_2$: shortcut

### Rekenmachines

Bovenstaande manieren zijn handig om het principe van talstelsels te begrijpen, maar als je in de praktijk een omrekening te doen is het handiger om gebruik te maken van de mogelijkheden van je besturingssysteem. Zo bieden de rekenmachines van Windows of Gnome standaard de mogelijkheid om tussen talstelsels om te rekenen. Vaak moet je wel de modus van het rekentoestel veranderen.

### Oefeningen

Als je het omrekenen van het ene naar het andere talstelsels wil inoefenen, dan kan je de volgende oefeningen uitproberen. Als controle kan je het rekentoestel gebruiken.
* 101011$_{(2)}$ = ?$_{(10)}$
* 78A$_{(16)}$ = ?$_{(10)}$
* 11000011110010$_{(2)}$ = ?$_{(16)}$
* DEAD$_{(16)}$ = ?$_{(2)}$
* 123$_{(16)}$ = ?$_{(10)}$
* 123$_{(10)}$ = ?$_{(2)}$
* 49233$_{(10)}$ = ?$_{(16)}$
* 10101$_{(10)}$ = ?$_{(16)}$
* 1110101$_{(2)}$ = ?$_{(10)}$
* ↑ James May gebruikt hetzelfde idee in zijn filmpje What are binary numbers?