C-taal voor beginners - hoofdstuk 9

wiskundig


[9.1 talstelsels] [9.2 machten] [9.3 converties] [9.4 opgaven en oplossingen]


9.1 talstelsels

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

9.2 machten

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
macht

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 converties

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.

9.4 opgaven en oplossingen

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 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

[Computing Numbers Tutorial]

Dave Timoney

 

Verder naar hoofdstuk 10

Terug naar inleiding