Basenstelsels zoals binair en hexadecimaal lijken in het begin een beetje vreemd. De sleutel is te begrijpen hoe verschillende systemen “tikken over” als een kilometerteller wanneer ze vol zijn. Basis 10, ons decimale systeem, “tikt over” wanneer het 10 items krijgt, waarbij een nieuw cijfer wordt gecreëerd. We wachten 60 seconden voordat we naar een nieuwe minuut “tikken”. Hex en binair zijn vergelijkbaar, maar tikken respectievelijk om de 16 en 2 items over.
Probeer hier getallen om te rekenen naar hex en binair:
Vroeger: Unary Numbers
Way back in the day, we didn’t have base systems! Het was in beide richtingen bergop, door de sneeuw en verzengende hitte. Als je één wilde tellen, schreef je:
l
Wanneer je 5 wilde, schreef je
lllll
En het is duidelijk, 1 + 5 = 6
l + lllll = llllll
Dit is de eenvoudigste manier van tellen.
Enter the Romans
In Romeinse cijfers, twee was één, tweemaal. Drie was één, driemaal:
one = Itwo = IIthree = III
Ze besloten echter dat ze beter konden dan de oude traditie van lijnen in het zand. Voor vijf konden we V gebruiken om lllll weer te geven en zoiets krijgen als
l + V = Vl
Niet slecht, hè? En natuurlijk zijn er nog veel meer symbolen (L, C, M, enz.) die je kunt gebruiken.
Het belangrijkste punt is dat V en lllll twee manieren zijn om het getal 5 te coderen.
Geef elk getal een naam
Een andere doorbraak was het besef dat elk getal zijn eigen, aparte concept kan zijn. In plaats van drie voor te stellen als een reeks enen, geef je het een eigen symbool: “3″. Doe dit van één tot negen, en je krijgt de symbolen:
1 2 3 4 5 6 7 8 9
De Romeinen waren dichtbij, zo dichtbij, maar gaven alleen unieke symbolen aan 5, 10, 50, 100, 1000, enz.
Gebruik je positie
Nu is het duidelijk dat je niet elk getal een eigen symbool kunt geven. Er zijn er gewoon te veel.
Maar let op een inzicht over Romeinse cijfers: ze gebruiken de positie van symbolen om betekenis aan te geven.
IV betekent “1 aftrekken van 5″
en VI betekent “1 bij 5 optellen”.
In ons getallenstelsel gebruiken we positie op een soortgelijke manier. We tellen altijd op en trekken nooit af. En elke positie is 10 meer dan de vorige.
Onze keuze voor de basis 10
Waarom hebben we gekozen om telkens met 10 te vermenigvuldigen? Waarschijnlijk omdat we 10 vingers hebben.
Een punt om te beseffen is dat je genoeg cijfers nodig hebt om “op te vullen” tot je bij het volgende getal bent. Ik zal het demonstreren.
Als we de kilometerteller bij wijze van spreken elke 10 willen omdraaien, hebben we symbolen nodig voor de getallen één tot en met negen; we zijn nog niet bij tien. Stel je voor dat getallen langzaam omhoog tikken – op welk moment draai je de volgende eenheid om en begin je weer bij nul?
Nul invoeren
En wat gebeurt er als we bij tien zijn? Hoe laten we zien dat we precies één “tien” willen en niets in de “enen” kolom?
We gebruiken nul, het getal dat niet bestaat. Nul is een heel begrip, het is een plaatshouder, een blanco, een spatie, en nog veel meer. Het volstaat te zeggen dat nul een van de grootste uitvindingen aller tijden is.
Nul stelt ons in staat een lege plaatshouder te hebben, iets dat de Romeinen niet hadden. Kijk eens hoe onhandig hun getallen zijn zonder.
George Orwells beroemde roman “1984” zou “MCMLXXXIV” zijn! Rolt zo van de tong, nietwaar?
Rekening houdend met andere grondslagen
Bedenk dat we ervoor gekozen hebben om onze kilometerteller elke tien om te laten rollen. Ons tellen ziet er als volgt uit:
123456789 (uh oh, I'm getting full!)10 (ticked over – start a new digit)
Wat als we bij het tellen bij 60 zouden tikken, zoals we doen voor seconden en minuten?
1 second2345…58591:00 (60 seconds aka 1 minute. We've started a new digit.)
Alles OK tot nu toe, toch? Merk op dat we de dubbele punt (:) gebruiken om aan te geven dat we bij een nieuw “cijfer” zijn. In basis 10 kan elk cijfer op zichzelf staan.
Probeer basis 16
Als we basis 16 willen, zouden we iets soortgelijks kunnen doen:
123456789101112131415 (we're getting full)1:00 (16 – we've started a new digit)
We willen hexadecimale getallen echter niet met de dubbele punt notatie schrijven (ook al zou dat kunnen). We maken liever aparte symbolen voor 10-15 zodat we gewoon getallen kunnen schrijven zoals we gewend zijn. We hebben geen getallen meer (1-9 al gebruikt, met 0 als plaatsvervanger), dus we hebben andere symbolen nodig. We zouden wat kronkellijntjes of andere vormen kunnen gebruiken, maar het is gebruikelijk om letters te gebruiken, in Romeinse stijl. Net zoals 5 een V werd, gebruiken programmeurs letters A-F om genoeg cijfers tot 16 te krijgen. Dat wil zeggen,
123456789A (10 – we're using the symbol "A")B (11)C (12)D (13)E (14)F (15 – uh oh, we're getting full)10 (16 – we start a new digit)
Ahah! Nu kunnen we één cijfer per “plaats” gebruiken, en we weten dat 10 eigenlijk betekent dat we één keer “over 16” zijn gegaan.
20 betekent dat we twee keer over 16 zijn gegaan (32).
25 betekent dat we twee keer over 16 zijn gegaan (waardoor we 32 hebben) en een extra 5 hebben. Het totaal is 32 + 5 = 37.
Quick review
Begrijp je me tot nu toe? Dit is best cool, toch? We kunnen tellen in elk systeem dat we willen. Merk ook op dat basis 16 meer “ruimte-efficiënt” is in de zin dat we een getal als 11 in een enkel cijfer kunnen schrijven: B.
Basis 16 verschilt eigenlijk niet zoveel van basis 10, we doen er alleen langer over om het te vullen.
De wondere wereld van binair
We hebben genoeg basissystemen gezien, van het te eenvoudige unaire, tot de wollige Romeinse cijfers, het gestage basis 10 en het compacte basis 16.
Wat is er zo geweldig aan binair? In de geest van de dingen eenvoudig houden, is het het eenvoudigste getallenstelsel dat het concept van “doortikken” heeft. Unair, waar we gewoon 1, 11, 111 schrijven… gaat maar door. Binair, met twee opties (1 en 0) ziet er als volgt uit:
1: 12: 10 (we're full – tick over)3: 114: 100 (we're full again – tick over)5: 1016: 1107: 1118: 1000 (tick over again)…
enzovoort.
Omdat binair zo eenvoudig is, is het heel gemakkelijk om in hardware te bouwen. Je hebt alleen dingen nodig die aan of uit kunnen (die 1 en 0 voorstellen), in plaats van dingen die 10 mogelijke toestanden hebben (om decimaal voor te stellen).
Omdat het zo eenvoudig is, is binair ook bestand tegen fouten. Als je signaal “gedeeltelijk aan” is (laten we zeggen 0,4), kun je aannemen dat dat een nul is. En als het grotendeels aan is (laten we zeggen 0.8), dan kun je aannemen dat het een 1 is. Als je een systeem gebruikt met 10 mogelijke toestanden, dan is het moeilijk te zeggen wanneer er een fout is opgetreden. Dit is een van de redenen waarom digitale signalen zo goed bestand zijn tegen ruis.
Andere voorbeelden van grondslagen
We gebruiken voortdurend andere grondslagen, zelfs dynamisch veranderende grondslagen. We denken er meestal niet zo over na:
Uren, minuten, seconden: 1:32:04
- We weten dat dit 1 uur, 32 minuten en 4 seconden is. In seconden is dit 16060 + 32*60 + 4.
Feet en inches: 3′ 5″
- Dit is 3 feet, 5 in of 3 * 12 + 5 inches.
Pounds en ounces: 8 lbs, 5 oz
- Sinds een pond 16 oz is, is dit 8 * 16 + 5 oz. We hebben al die tijd een getallensysteem van basis 16 gebruikt!
Denken in onderdelen
“10″ in een getallensysteem geeft de basis aan, en betekent dat we één keer hebben overgetikt. 10 in binair betekent twee, 10 in decimaal betekent tien, en 10 in hexadecimaal is zestien.
Hoe houd je deze getallen uit elkaar? Programmeurs schrijven vaak “0b” voor binaire getallen. Dus 2 in binair is
0b10
Zo schrijven ze ook 0x voor heximale getallen. Dus 16 in hex is:
0×10
Als er geen symbolen (0b of 0x) voor staan, nemen we aan dat het basis 10 is, een gewoon getal.
Nu verder en geniet van je nieuwe kennis!
Andere Berichten In Deze Serie
- Numer Systems and Bases
- The Quick Guide to GUIDs
- Understanding Quake’s Fast Inverse Square Root
- A Simple Introduction To Computer Networking
- Swap two variables using XOR
- Understanding Big and Little Endian Byte Order
- Unicode and You
- A little diddy about binary file formats
- Sorting Algorithms