Numer System Conversions
Bij het schrijven van programma’s voor microcontrollers hebben we meestal te maken met 3 verschillende getallenstelsels: decimaal, binair en hexadecimaal (of hex). We gebruiken decimaal omdat dat natuurlijk is; dat is de manier waarop we tellen. Helaas is dit niet de manier waarop computers tellen. Aangezien computers en microcontrollers beperkt zijn tot 1’s en 0’s, tellen zij met reeksen van deze getallen. Dit is het binaire getallensysteem. Binaire getallen worden gewoonlijk voorafgegaan door het teken “0b”, dat geen deel uitmaakt van het getal. Soms worden ze ook onderverdeeld in groepen van 4 cijfers om ze gemakkelijker leesbaar te maken en om ze gemakkelijker te kunnen relateren aan het hexadecimale getallensysteem. Een voorbeeld van een binair getal is 0b0100.1011. De punten in het getal stellen niets voor, ze maken het alleen gemakkelijker om het getal te lezen.
Het binaire systeem is eenvoudig te begrijpen, maar er zijn veel cijfers nodig om met het binaire systeem grote getallen weer te geven. Het hexadecimale systeem kan veel grotere getallen weergeven met minder tekens, en het lijkt sterk op binaire getallen. Hexadecimale getallen worden gewoonlijk voorafgegaan door de tekens “0x”, die geen deel uitmaken van het getal. Een enkel hexadecimaal cijfer kan vier binaire cijfers voorstellen!
Binaire getallen kunnen alleen uit 1’s en 0’s bestaan; gewoonlijk bestaat een binair getal uit 8 cijfers (of een veelvoud van 8) als het in een soort computer (of microcontroller) wordt gebruikt. Het is nuttig te weten hoe je een binair getal omzet in een decimaal getal en omgekeerd. Dus hoe converteren we tussen getallenstelsels? Kijk eerst eens hoe we de waarde van een decimaal getal bepalen. Het getal 268 kan worden opgesplitst als 200 + 60 + 8, of 2 * (10^2) + 6 * (10^1) + 8 * (10^0). Er zijn twee belangrijke getallen die we moeten kennen om het getal te ‘deconstrueren’ – de basis van het getallenstelsel en de plaats van het cijfer binnen het getal. De basis van een decimaal getal is 10. Wanneer we het getal 268 omrekenen, is 2 het tweede cijfer, 6 het eerste cijfer en 8 het nulcijfer. Elk cijfer moet worden geschaald volgens zijn plaats in het getal. De schaal van het cijfer is het grondtal van het getallenstelsel verheven tot de macht van de plaats van het cijfer in het getal. Dus elk getal wordt geschaald, en dan worden alle geschaalde cijfers opgeteld om de totale waarde van het getal te vinden.
Dezelfde methode kan worden gebruikt om de waarde van een binair getal te vinden. Laten we bijvoorbeeld eens kijken naar het getal 0b1011.0101. De basis van het binaire stelsel is 2 (het voorvoegsel 0b wordt vaak in code gebruikt om aan te geven dat het getal in binair formaat is). De waarde van ons getal is: 1*(2^7)+0*(2^6)+1*(2^5)+1*(2^4)+0*(2^3)+1*(2^2)+0*(2^1)+1*(2^0), wat gelijk is aan 181.
0b1011.0101. Wat een volstrekt inefficiënte manier om een getal te typen! Maar we kunnen hetzelfde binaire getal weergeven met slechts 2 hexadecimale cijfers. Maar eerst zetten we een hexadecimaal (hex) getal om in decimaal, net zoals we deden voor een binair getal. Wat dacht je van 0xB5? Wacht, wat?! Het voorvoegsel 0x wordt in code gebruikt om aan te geven dat het getal in hex wordt geschreven. Maar wat doet de ‘B’ daar? Het hexadecimale formaat heeft een basis van 16, wat betekent dat elk cijfer tot 16 verschillende waarden kan vertegenwoordigen. Helaas hebben we geen numerieke cijfers meer na ‘9’, dus gaan we letters gebruiken. De letter A staat voor 10, de B voor 11, de C voor 12, de D voor 13, de E voor 14 en de F voor 15. F’ is het grootste cijfer in het hex-nummering systeem. We rekenen het getal op dezelfde manier om als voorheen. De waarde van 0xB5, is dan: B*(16^1)+5*(16^0) of 181.
Weten hoe je binair en hex naar decimaal moet omrekenen is belangrijk, maar de meest nuttige getalomzetting is waarschijnlijk het omrekenen tussen hex en binair. Deze twee getallenstelsels werken eigenlijk heel goed samen. De getallenstelsels zijn toevallig zo verwant dat een enkel hex cijfer precies 4 binaire cijfers voorstelt, en dus kunnen 2 hex cijfers 8 bits (of binaire cijfers) voorstellen. Hier is een tabel die laat zien hoe elk hex-cijfer gerelateerd is aan het binaire systeem:
Binaire waarde | Hex waarde |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
11 | F |
Voorbeeld, om het hexadecimale getal 0x1C om te zetten naar binair, zouden we de overeenkomstige binaire waarde voor 1 en C vinden en deze combineren. Dus, 0x1C in binair is 0b0001.1100. Als we de hex waarde van een binair getal willen berekenen gaan we gewoon de andere kant op. Om de hex-representatie van het binaire getal 0b0010.1011 te vinden, vinden we eerst de hex-waarde voor 0010, dan de hex-waarde voor 1011 en combineren die; de hex-waarde zou dan 0x2B.
Er zijn veel gratis programma’s beschikbaar om te helpen bij het omrekenen tussen deze getallenstelsels, google maar eens op ‘hex number conversion’. Als je Windows als besturingssysteem gebruikt, heb je een geweldig hulpmiddel ingebouwd in de rekenmachine. Zet de rekenmachine in de wetenschappelijke modus en je kunt tussen getallenstelsels converteren door een getal in te typen en vervolgens het formaat van de rekenmachine te veranderen!