C-taal voor beginners - hoofdstuk 9
wiskundig
[9.1 talstelsels] [9.2 machten] [9.3 converties] [9.4 opgaven en oplossingen]
In dit hoofdstuk behandel ik oppervlakkig de verschillende talstelsels en methodes die u kan tegenkomen tijdens het programmeren. Normaal zou alle informatie correct moeten zijn, maar als u toch onwaarheden denkt gevonden te hebben, laat het mij dan weten. U heeft een browser nodig die machten en subscripts weergeeft.
9.1.1 decimaal
Het decimale talstelsel is het normale stelsel dat u reeds vroeg aangeleerd krijgt. Het bevat tien cijfers: 0, 1, 2, 3, 4, 5, 6, 7, 8 en 9. We zeggen daarom dat de basis 10 is. De regel bij talstelsels is dat een getal geschreven kan worden als de som van machten van de basis, in dit geval 10. Voorbeeld:
837,52610 = 8 * 102 + 3 * 101 + 7 * 100 + 5 * 10-1 + 2 * 10-2 + 6 * 10-3
U ziet ook dat de basis achter het getal geschreven wordt, in subscript.
9.1.2 binair
Het binaire systeem bevat slechts twee cijfers: 0 en 1. Dit is het systeem dat machines en computers gebruiken, omdat elektrische apparaten met bits werken. Een bit is ofwel 0(geen impuls) of 1(impuls). Door de algemene regel toe te passen kunnen we de decimale waarde als volgt vinden:
101,11012 = 1 * 22 + 0 * 21 + 1 * 20 + 1 * 2-1 + 1 * 2-2 + 0 * 2-3 + 1 * 2-4
De volgende tabel toont hoe u tot 16 kan tellen in het binair
| decimaal | binair |
| 0 | 00000 |
| 1 | 00001 |
| 2 | 00010 |
| 3 | 00011 |
| 4 | 00100 |
| 5 | 00101 |
| 6 | 00110 |
| 7 | 00111 |
| 8 | 01000 |
| 9 | 01001 |
| 10 | 01010 |
| 11 | 01011 |
| 12 | 01100 |
| 13 | 01101 |
| 14 | 01110 |
| 15 | 01111 |
| 16 | 10000 |
Ik gebruik hier vijf bits om een binair getal weer te geven. Voorloopnullen mogen echter weggelaten worden, of u mag er bij plaatsen. Aan de rechtse kant mogen geen extra tekens geplaatst worden. Hoe groter de getallen worden, hoe groter het aantal bits geleidelijk aan zal worden.
9.1.3 hexadecimaal
Het hexadecimale stelsel heeft als basis 16 en gebruikt de symbolen van 0 tot 9 en van A tot F. De alfabetische tekens worden gebruikt om het aantal unieke symbolen tot zestien te brengen. Nu werken we natuurlijk met machten van de basis 16:
302A,1D16 = 3 * 163 + 0 * 162 + 2 * 161 + 10 * 160 + 1 * 16-1 + 13 * 16-2
We kunnen onze tabel als volgt uitbreiden:
| decimaal | hexadecimaal | binair |
| 0 | 0 | 00000 |
| 1 | 1 | 00001 |
| 2 | 2 | 00010 |
| 3 | 3 | 00011 |
| 4 | 4 | 00100 |
| 5 | 5 | 00101 |
| 6 | 6 | 00110 |
| 7 | 7 | 00111 |
| 8 | 8 | 01000 |
| 9 | 9 | 01001 |
| 10 | A | 01010 |
| 11 | B | 01011 |
| 12 | C | 01100 |
| 13 | D | 01101 |
| 14 | E | 01110 |
| 15 | F | 01111 |
| 16 | 10 | 10000 |
9.1.4 octaal
Bij het octale talstelsel gebruiken we een basis van 8. De symbolen gaan van 0 tot 7.
17,48 = 1 * 81 + 7 * 80 + 4 * 8-1 + 8* 8-2
Tabel:
| decimaal | hexadecimaal | octaal | binair |
| 0 | 0 | 0 | 00000 |
| 1 | 1 | 1 | 00001 |
| 2 | 2 | 2 | 00010 |
| 3 | 3 | 3 | 00011 |
| 4 | 4 | 4 | 00100 |
| 5 | 5 | 5 | 00101 |
| 6 | 6 | 6 | 00110 |
| 7 | 7 | 7 | 00111 |
| 8 | 8 | 10 | 01000 |
| 9 | 9 | 11 | 01001 |
| 10 | A | 12 | 01010 |
| 11 | B | 13 | 01011 |
| 12 | C | 14 | 01100 |
| 13 | D | 15 | 01101 |
| 14 | E | 16 | 01110 |
| 15 | F | 17 | 01111 |
| 16 | 10 | 20 | 10000 |
Bij het gebruiken en omvormen van deze talstelsels komen een boel machtsverheffingen kijken. Ik geef hier de voornaamste met de bedoeling dat u tenminste de eenvoudigste ervan instudeert.
getal |
10 |
2 |
8 |
16 |
| 2 | 100 | 4 | 64 | 256 |
| 3 | 1000 | 8 | 512 | 4096 |
| 4 | 10000 | 16 | 4096 | 65536 |
| 5 | 100000 | 32 | 32768 | 1048576 |
| 6 | 1000000 | 64 | 262144 | 16777216 |
| 7 | 10000000 | 128 | 2097152 | 268435456 |
| -1 | 0,1 | 0,5 | 0,125 | 0,0625 |
| -2 | 0,01 | 0,25 | 0,015652 | 0,00390625 |
| -3 | 0,001 | 0,125 | 0,001953125 | n.v.t |
| -4 | 0,0001 | 0,0625 | n.v.t. | n.v.t |
| -5 | 0,00001 | 0,03125 | n.v.t. | n.v.t. |
| -6 | 0,000001 | 0,015625 | n.v.t. | n.v.t. |
Een lijst met grote binaire cijfers:
| decimaal | binair |
| 16 | 10000 |
| 32 | 100000 |
| 64 | 1000000 |
| 128 | 10000000 |
| 256 | 100000000 |
| 1024 | 1000000000 |
| 2048 | 10000000000 |
| 4096 | 100000000000 |
Als u goed kijkt merkt u een zekere logica op. Bij machten van 2 is het exponent van de macht gelijk aan het aantal nullen bij het binaire getal. Voorbeeld:
32 = 25, dus komen er 5 nullen bij het binaire getal: 100000
9.3.1 van 10 naar 2, 8 en 16
Om een decimaal getal naar een binair, hexadecimaal of octaal getal om te vormen kan u éénzelfde mehode toepassen. Het enige dat telkens verschilt is de basis (2, 8 of 16).
Stel, we hebben een decimaal getal 21,375 en we willen dit converteren naar een binair getal (basis 2). We gebruiken de formule: "deel het getal door de basis en onthoud de rest":
0 <-- 1 <-- 2 <-- 5 <-- 10 <-- 21
1 0 1 0 1
We lezen van links naar rechts: 21 gedeeld door 2 is 10, met als rest 1; 10 gedeeld door 2 is 5 met als rest 0; enz... . We hebben nu het binaire gedeelte van het getal dat voor de komma hoort, namelijk 10101. Wat het gedeelte na de komma betreft passen we een tweede formule toe: "vermenigvuldig het gedeelte na de komma met de basis en gebruik het gedeelte na de komma van het uitkomstgetal om opnieuw met de basis te vermenigvuldigen":
0,375 * 2 = 0,750 --> 0,75 * 2 = 1,50 --> 0,50 * 2 = 1,00
Het onderlijnde gedeelte wordt dus telkens gebruikt om opnieuw met de basis te vermenigvuldigen. De bits voor de komma gebruiken we als tweede deel van ons binair getal, namelijk 011. De volledige uitkomst is dus:
21,37510 = 10101,0112
Deze regels kan u ook toepassen om van basis 10 naar basis 8 en 16 te converteren. De regels blijven hetzelfde, enkel de basis verandert. In plaats van 2 gebruiken we dan 8 of 16.
Let op: als u bij het werken met hexadecimale getallen als uitkomst cijfers krijgt die groter zijn dan 9 moet u deze in het resultaat omvormen naar de juiste letter.
9.3.2 van 2, 8 en 16 naar 10 (methode 2)
Om een getal met basis 2, 8 of 16 naar een decimaal bestand te converteren kunnen we ook telkens eenzelfde formule toepassen. Deze luidt: "Van het gedeelte voor de komma, vermenigvuldig de eerste bit met de basis en tel de tweede bit erbij op. Onthoud de rest, vermenigvuldig deze met de basis en tel de volgende bit erbij op, enz... ". Dit klinkt nogal ingewikkeld maar is het niet. Een voorbeeld van een convertie van basis 2 naar basis 10. Stel, we hebben binaire getal 101,1011:
1(eerste bit) * 2 + 0(tweede bit) = 2; 2 * 2 + 1(derde bit )= 5
Het laatste getal is ons deel van het resultaat voor de komma, in dit geval 5.
Voor het gedeelte na de komma gebruiken we de oude manier:
1101 = 1 * 2-1 + 1 * 2-2 + 0 * 2-3 + 1 * 2-4
Dit geeft als resultaat 0,8125, wat het gedeelte na de komma wordt. Dus onze volledige uitkomst is:
101,11012 = 5,812510
Voor de hexadecimale en octale omrekening gebruiken we dezelfde regels, enkel de basis verandert weer.
9.3.3 van 2 naar 8
Dit is één van de zeer simpele omzettingen. Splits het binaire getal in groepen van drie, beginnend bij de komma, en neem de octale waarde per groep. We hebben bijvoorbeeld het binaire getal 11111011,10101. We berekenen de octale waarde als volgt:
011 111 011 101 010
3 7 3 5 2
Het volledige resultaat:
11111011,101012 = 373,528
U merkt dat het binaire getal uit 13 bits bestaat. Hiermee kunnen we geen volledige groepjes van 3 maken. In dat geval plaats je één of meer nullen voor of achter de reeks, afhankelijk van de linkse en rechtse positie t.o.v. de komma.
9.3.4 van 2 naar 16
De binair-hexadecimale convertie werkt op dezelfde manier, behalve dat we nu groepjes van vier maken en er de hexadecimale waarde van nemen. Bijvoorbeeld: 1110100010111,010101:
0011 1010 0010 1111 0101 0100
3 A 2 F 5 4
Het volledige resultaat:
1110100010111,0101012 = 3A2F5416
9.3.5 van 8 naar 2
Nu werken we in de omgekeerde volgorde. We nemen octaal getal 3363,7:
3 3 6 3 7
011 011 110 011 111
Het volledige resultaat:
3363,78 = 11011110011,1112
9.3.6 van 16 naar 2
Weer op dezelfde manier. Het hexadecimale getal 3E,7 kunnen we als volgt omrekenen naar een binair getal:
3 E 7
0011 1110 0111
Het volledige resultaat:
3E716 = 111110,01112
Opmerking bij alle converties: voor omrekeningen die hier niet beschreven werden moet u eerst een tussenstap doen. Om van een hexadecimaal getal naar een octaal getal te gaan, berekent u, bijvoorbeeld, eerst de binaire waarde om dan van het binaire naar een octaal getal te converteren. Bij getallen zonder komma's kan u dezelfde methode's gebruiken als bij getallen met komma's.
Ik maakte een tiental converteeroefeningen in één MS-Word97 bestand (.doc). U kan dit op twee manieren downloaden:
On-line:
Indien u de cursus gedownload heeft en off-line aan het lezen bent:
het bestand zelf: converts.doc (23 kB)
Het is mogelijk dat uw browser geconfigureerd is om een Word bestand onmiddelijk te openen, in plaats van te downloaden. In dat geval slaat u het bestand gewoon onder Word op. De tekst werd geoptimaliseerd om afgedrukt te worden. Ik raad u aan dit te doen, zodat de oefeningen ook beschikbaar zijn als u uw computer niet aan heeft staan.
opgaven
1. Probeer functies te schrijven om de berekeningsmethodes in dit hoofdstuk uit te voeren. Schrijf bijvoorbeeld een programma dat een binair getal vraagt en dit omrekent naar de decimale, hexadecimale en octale waarde. Voeg ook de mogelijkheid tot kommagetallen in en u heeft een professioneel programma. De C compiler kan zelf de hexadecimale en octale waarde weergeven, als u dit zo bepaald in uw printf() functie, maar het gaat hem om het opdoen van ervaring. Kommagetallen worden op die manier trouwens niet juist weergegeven.
referenties
Dave Timoney