Talstelsels Over binaire, decimale en hexadecimale getallen René Dohmen 1 Inleiding Dit boek gaat over de manier waarop getallen in een computer worden vastgelegd. Je hebt vast wel eens gehoord dat computers met enen en nullen rekenen. Nu leer je hoe getallen met enen en nullen worden opgeschreven. In het dagelijks leven schrijven we getallen in het tientallig stelsel op. De notatie met enen en nullen heet binaire notatie. Je leert hoe je getallen van de ene vorm in de andere vorm kunt omrekenen. Verder leer je nog hoe een computer getallen optelt, aftrekt en vermenigvuldigt. Omdat binaire getallen snel lang worden en daardoor moeilijk leesbaar zijn, worden getallen regelmatig als hexadecimale geschreven. Tenslotte leer je hoe je hele grote en hele kleine kommagetallen in een computer kunt bewaren. Omdat het boekje in de eerste plaats geschreven is voor leerlingen die het vak Informatica in de bovenbouw van de havo en het vwo volgen, kom je soms de toevoeging vwo in de titel tegen als ik de lesstof meer geschikt vind voor vwo'ers. 2 Inhoudsopgave 1.1 Het decimale talstelsels 2.1 2.2 2.3 2.4 Het binair (tweetalig) talstelsel (bi=2) Bit en Bytes Binair naar decimaal Decimaal naar binair 3.1 3.2 3.3 3.4 Rekenen met binaire getallen: optellen Negatieve getallen Negatieve binaire getallen lezen Rekenen met binaire getallen: aftrekken 4.1 4.2 4.3 4.4 4.5 Het hexadecimaal of zestientallig stelsel Hexadecimaal (zestientallig) naar tientallig Tientallig naar hexadecimaal (zestientallig) Omrekenen van hexadecimaal naar binair Van hexadecimaal naar binair 5.1 Mogelijke conversies 6.1 6.2 6.3 Binaire getallen vermenigvuldigen: Arithmetic Shift Optellingen met méér dan twee binaire getallen Nog sneller vermenigvuldigen 7.1 7.2 Andere talstelsels (VWO) Opteltabellen (VWO) 8.1 8.2 Zwevende kommagetallen (VWO) Enkelvoudige en dubbele precisie (VWO) 9.1 Uitwerkingen 10.1 Bijlage 3 1.1 Het decimaal talstelsel In het tientallig stelsel betekent 123 het volgende: 3 1 (drie eenheden) 2 10 (twee tientallen) 1 100 (1 een honderdtal) We kunnen dit als volgt opschrijven: 2 1 0 1 2 3 1 1 02 1 03 1 0 Van achter naar voren bekeken komen dus de machten van 10 aan de beurt. Daarom heet deze manier om getallen te noteren het tientallig of decimaalstelsel (deci=10). Tien is het grondtal van de machten. Op elke positie kun je uit tien cijfers kiezen: 0..9. Opgave 1.1.1 Waarom is 9 het hoogste cijfer op een positie in het decimaal stelsel? Misschien vind je het vreemd dat 1 geschreven wordt als 100. Bekijk dan de volgende tabel eens. In de tweede kolom staan machten van 2. Als je een regel naar beneden gaat wordt de exponent 1 hoger. De uitkomst van de berekening wordt steeds 2x zo groot. Als je een regel omhoog gaat wordt de exponent 1 lager. De uitkomst wordt dan 2x zo klein. Als je van 21 een regel omhoog gaat komt je bij 20 en wordt de waarde dus door twee gedeeld: 2/2=1. 10=1 11=1 12=1 13=1 14=1 20=1 21=2 22=4 23=8 24=16 30=1 31=3 32=9 33=27 34=81 100=1 101=10 102=100 103=1000 104=10000 4 160=1 161=16 162=256 163=4096 164=65536 2.1 Het binair (tweetalig) talstelsel (bi=2) In een computer zitten chips. Op die chips zitten heel veel elektronische schakelaars (transistors). Die schakelaars kunnen open zijn (0) of gesloten (1). Daarom zeggen we dat computers met nullen en enen rekenen. Opgave 2.1.1 Is er iets op tegen om de 0 en 1 als volgt aan open en gesloten te koppelen: openen (1) of gesloten (0)? 5 2.2 Bit en Bytes Elke positie in het tweetallig stelsel heet een bit. Dat is een samentrekking van binairy digit (Nederlands: binair getal). Een getal groter dan 1 bestaat uit meerdere bits. Bit kort je af met de kleine letter b. Vaak wordt in een computer met groepjes van bits gewerkt. Als het er acht zijn zeg je op z’n Engels dat ze ‘by eight’ gegroepeerd zijn, dat korten we af als Byte. Byte kort je weer af met de hoofdletter B. In het binair talstelsel is elke positie een macht van twee waard. Je kunt op elke positie dus 0 of 1 invullen. vooraan/links 16 2 4 achteraan/rechts 8 2 2 4 2 2 2 1 2 1 2 0 In de bovenstaande tabel is plaats voor 5 bits, maar binaire getallen kunnen natuurlijk ook groter zijn. Opgave 2.2.1 a Hoeveel verschillende getallen kun je met een byte maken? b Wat is het kleinste en het grootste getal? c Hoeveel verschillende getallen kun je met x bits maken? d Wat is het kleinste en het grootste getal met x bits? 6 2.3 Binair naar decimaal “Er zijn 10 soorten mensen: Mensen die binair kunnen tellen en mensen die dat niet kunnen." 101 is een voorbeeld van een binair geschreven getal. Omdat 101 ook een getal in het tientallig stelsel zou kunnen zijn schrijven we het grondtal van het talstelsel rechtsonder het getal: 1012 Voorbeeld 1 Wat is de waarde van 1012 ? 2 1 0 1 0 1 1 2 0 2 1 2 1 4 0 2 1 1 4 0 1 5 2 Voorbeeld 2 Hoe schrijf je 1012 in het tientallig stelsel? 100112= 1× 2 4+ 0× 23+ 0× 22+ 1× 21+ 1× 2 0= 16+ 2+ 1= 19 7 De wiskundige Leibniz schreef al over binaire getallen, lang voor er computers bestonden. 8 9 2.4 Decimaal naar binair Nu de omgekeerde vraag: hoe kun je een decimaal getal omrekenen naar de binaire schrijfwijze? Methode 1 De eerste methode werkt door de grootste macht van twee van het getal af te trekken. We gaan daarmee door tot we bij nul zijn. Hiernaast zie je hoe je dat bij het decimale getal 102 doet. Allereerst is 64 de grootste macht van 2 die ‘past’. Van wat je over houdt, haal je steeds weer een kleinere macht van 2 af. 1 : 64 kun je eraf halen 1 : 32 kun je eraf halen 0 : 16 niet 0 : 8 ook niet 1 : 4 wel 1 : 2 ook 0 : 1 niet Je noteert dit getal als 1100110. 0 Let op: denk eraan dat je doorrekent tot 2 = 1 10 102 64 38 32 6 4 2 2 0 Methode 2 De tweede methode kijkt naar de rest, na deling door 2. Als voorbeeld bekijken we het getal 35. We beginnen met 35. 35:2 = 17 rest 1 We gaan verder met 17. 17:2 = 8 rest 1 Dan volgt 8:2 = 4 rest 0 Zo gaan we door tot er nul over blijft. De restwaarde die je vond vormen in omgekeerde volgorde het binaire getal. In de onderstaande tabel is de berekening samengevat. waarde Rest na deling door twee 35 1 17 1 8 0 4 0 2 0 1 1 0 Het binaire notatie van 35 is 100011. 11 2.5 Andere groepjes van bits Er zijn ook namen voor andere groepjes van bits. Naam Bitlengte Nibble 4 Byte 8 Word 16 Double Word 32 Quad Word 64 Een groepje van 4 bits heet een nibble. Een groepje van 16 bits heet een Word. Een groepjes van 32 bits heet een Double Word. Tegenwoordig bestaan er zelfs processoren die met 64 bits (een Quad Word) tegelijk kunnen rekenen. 12 3.1 Rekenen met binaire getallen: optellen Binaire getallen optellen gaat net zoals met decimale getallen. In het decimaal stelsel gaat het zo: 23 16 + Eerst bereken je 3+6. Dat is 9. 23 16 + 9 Dan 2+1=3 23 16 + 39 Als de uitkomst van een berekening groter dan 9 is, onthoud je de tientallen voor de volgende stap: 58 79 + 8+9=17: 7 opschrijven, 1 onthouden 1 58 79 + 7 13 1+5+7=13, 3 opschrijven, 1 onthouden 11 58 79 + 37 Omdat dit de laatste stap was, schrijven we de onthouden 1 nu ervoor op: 11 58 79 + 137 Het onthouden getal heet in het Engels carry (wat dragen betekent). Bij binaire getallen gaat het niet anders. Er zijn echter maar 4 optellingen die je hoeft te kennen: 0+0=0 0+1=1 1+0=1 1+1=10 → 0 opschrijven en 1 onthouden We proberen het eens: 11 10 + We berekenen 1+0=1 11 10 + 1 1+1=10, 0 opschrijven, 1 onthouden,. Omdat dit de laatste berekening was, schrijven we de 1 meteen op. 14 1 11 10 101 + Je kunt deze berekening in het tientallig stelsel controleren: 113, 102, 3+2=5101. Dus het klopt. Als je twee getallen bij elkaar telt, kan het gebeuren dat je 3 bits bij elkaar moet tellen. Er zijn dan 8 mogelijkheden: 0+0+0=0 0+0+1=1 0+1+0=1 0+1+1=10 (=2) 1+0+0=1 1+0+1=10 1+1+0=10 1+1+1=11 (=3) Als je bij een tussenstap in een optelling 1+1+1 tegenkomt moet je 1 opschrijven én 1 onthouden. Opgave 3.1.1 Tel de volgende binaire getallen bij elkaar door ze onder elkaar te schijven. Laat zien hoe je aan je antwoord komt door de carry erboven te schrijven. a 100101 + 001100 b 100101 + 011101 c 101110 + 101010 LET OP: de uitkomst van een optelling is soms langer dan de getallen die opgeteld werden. Als er gegeven is dat getallen in een Byte staan, zijn er maximaal 8 bits voor de getallen beschikbaar. Een getal van 9 bits past dus niet meer. Als een getal te lang is spreken we van overflow → het getal past niet meer. De bits vooraan het getal vallen weg. 15 3.2 Negatieve getallen Als je negatieve getallen wilt opslaan in een rijtje bits kun je afspreken dat het eerste bit bepaald of het getal positief of negatief (0 is positief, 1 is negatief). In zestien bits houdt je dan vijftien bits over om het getal te schrijven. Een eerste (niet zo handige) poging: 0000000000000001 = +1 1000000000000001 = -1 Zo een rijtje van zestien bits waarin je zowel positieve als negatieve gehele getallen kunt bewaren heet een Integer. Deze manier om negatieve getallen op te slaan wordt echter niet gebruikt, omdat optellingen met negatieve getallen niet meer zo handig te berekenen zijn. Opgave 3.2.1 a Bereken –1 + 1 b Bereken 1000000000000001 + 00000000000000001 c Reken je antwoord van b om naar het decimale stelsel (let op het eerste bitje!) Je ziet dat eenvoudig optellen van negatieve en positieve getallen op deze manier niet gaat. We gaan nu onderzoeken welke getallen opgeteld wél nul geven. In decimale notatie zijn –6 en 6 samen 0. 16 Opgave 3.2.2 Maak nu de optellingen die hieronder staan. Het zijn steeds bytes, dus als je aan de voorkant een carry overhoudt gooi je dat bitje gewoon weg. Wat valt je op? 00000101 11111011+ 00001001 11110111+ 00010001 11101111+ 00100001 11011111+ 01000001 10111111+ Probeer nu de regel te achterhalen waarmee je van een positief getal een negatief getal maakt. Opgave 3.2.3 Controleer je regel nu aan de hand van de volgende voorbeelden. 00000100 11111100+ 00001000 11111000+ 00010000 11110000+ 00100001 11100000+ 01000001 11000000+ Heb je de regel nu gevonden? Het recept om van een positief binair getal een negatief binair getal te maken Een positief getal (nul vooraan!) kun je negatief maken door alle bits om te keren (1 wordt 0 en 0 wordt 1) en dan 1 bij de uitkomst op te tellen. De notatie van negatieve binaire getallen staat bekend als Two's complement. In de bijlage vindt je een bewijs van deze regel. Let op: 11111111 kan dus twee betekenissen hebben als het eerste bit voor het teken staat is het een negatief getal (-1). Als alle bits voor het getal gebruikt worden is het positieve getal 255. Ga er in het algemeen vanuit dat er geen teken in het spel is, tenzij dat nadrukkelijk vermeld wordt. 17 Opgave 3.2.4 Maak de volgende positieve getallen negatief. Het eerst bit staat voor het teken. a 0111000 b 0101010 c 0000111 18 3.3 Negatieve binaire getallen lezen Hoe lees je gemakkelijk hoeveel 101101 is? 101101 teken apart zetten 1 | 01101 bereken de waarde van het deel voor en achter de streep (32,13) Maak het eerste getal negatief en tel ze op: -32 + 13 = -19 Of anders uitgelegd: De voorste 1 is nu het 6e bit. Normaal is dat 32 waard. Maar omdat het een teken is tel je het voor –32. De rest van het getal is 1+4+8 = 13. Samen geeft dat –32 + 13 = -19. Nog een voorbeeld: 101001 1|01001 -32 + 8 + 1 = -32 + 9 = -23 NB: Als het eerste bit een 0 is bereken je gewoon de waarde alsof er geen teken voorop staat. Opgave 3.3.1 Oefen nu met de volgende getallen: a 10001 b 10011 c 11111 d 11010 e 11011 Opgave 3.3.2 Schrijf de volgende negatieve getallen binair in een Byte a -20 b -100 19 Wat is nu het grootste en kleinste getal als het eerste bit voor het teken staat? Als voorbeeld nemen we een getal van 6 bits, waarvan het eerste bit dus het teken is. Het grootste positieve getal is: 011111 Het kleinste negatieve: 100000 Opgave 3.3.3 Ga er bij de onderstaande vragen vanuit dat je te maken hebt met getallen van 6 bits waarvan het eerste bit voor het teken staat. a Hoe schrijf je het getal 0? b Hoe schrijf je het getal -1? 20 Intermezzo Negatieve binaire getallen in de rekenmachine van Windows Als je een positief binair getal met min één vermenigvuldigd krijgt je een binair getal dat 64 bits lang is. Dat komt doordat de rekenmachine altijd met getallen van 64 bits rekent. Je kunt de rekenmachine van Windows dus niet gebruiken om opgaven met negatieve getallen te controleren! 21 3.4 Rekenen met binaire getallen: aftrekken Minsommen kun je zien als optellen met een negatief getal. 100 – 50 = 50 100 + (-50) = 50 Als je met binaire getallen minsommen wilt maken kan dat op de volgende manier: 8 – 2 = 8 + (-2) = 6 Binair schrijf je dit als: 01000 – 00010 = 01000 + 11110 = 00110 Let op: bij de laatste berekening treedt wel een overflow op! 22 4.1 Het hexadecimaal of zestientallig stelsel In het hexadecimaal (hexa=6, deci=10) of zestientalligstelsel is elke positie een macht van 16 waard. vooraan 163 4096 2 16 256 16 16 1 achteraan 160 1 Op elke positie kun je kiezen uit 16 waarde. We hebben echter maar 10 cijfers (0 t/m 9). Voor de waarde 10 t/m 15 moeten we dus een nieuw ‘cijfer’ bedenken. Ooit heeft men er voor gekozen om hier voor de hoofdletters A t/m F te gebruiken. De cijfers in het zestientallig stelsel zijn dus 0..9 en daarna A t/m F. De volgende getallen kunnen dus getallen in het zestientallig stelsel zijn: 123 ABC 9AB Omdat 123 ook als decimaal getal te lezen is kun je weer duidelijk maken dat het hexadecimaal is door 16 rechtsonder in subscript te schrijven: 12316 . 4.2 Hexadecimaal (zestientallig) naar tientallig Hoe reken je deze getallen naar het tientalligstelsel om? 2 1 0 1 2 3 1 1 6 2 1 6 3 1 6 1 2 5 6 2 1 6 3 1 2 5 6 3 2 3 2 9 1 1 6 2 1 0 A B C A 1 6 B 1 6 C 1 6 1 0 2 5 6 1 1 1 6 1 2 1 2 5 6 0 1 7 6 1 2 2 7 4 1 6 2 1 0 9 A B 9 1 6 A 1 6 B 1 6 9 2 5 6 1 0 1 6 1 1 1 2 4 7 5 1 6 Opgave 4.2.1 Bedenk zelf 3 getallen in hexadecimale notatie en reken ze naar de decimale notatie om. 23 24 4.3 Tientallig naar hexadecimaal (zestientallig) Ook de omrekening van het tientallig naar het zestientallig stelsel moet je kunnen maken. Bijvoorbeeld: hoeveel is 234510 in het zestientallig stelsel is. We schrijven zo een opdracht als volgt op: 234510 = …16 Net als bij de omrekening van decimaal naar binair zoeken we de hoogste macht die in het getal past. Van decimaal naar binair zoeken we de hoogste macht van twee. Bij de omrekening van decimaal naar hexadecimaal zoeken we de hoogste macht van 16. De eerste machten van 16 vermelden we eerst nog even als geheugensteuntje: 160 =1 161 = 16 162 = 256 163 = 4096 Let er op dat een macht nu meer dan 1 keer kan passen (maximaal 15=F keer). 9 256= 2 16= 9 1= 2345 2304 41 32 9 9 0 Dus 234510 = 92916 11 256= 5 16= 2 1= 2898 2816 82 80 2 2 0 25 De 11 schrijf je op als B, dus 289810 = B5216 Opgave 4.3.1 Waarom kun je in plaats van B52 niet 1152 schrijven? Opgave 4.3.2 Bedenk zelf 3 getallen in decimale notatie en reken ze naar hexadecimale notatie om. 26 4.4 Omrekenen van hexadecimaal naar binair Als je wilt omrekenen van hexadecimaal naar binair kan dat door eerst om te rekenen naar het decimaal stelsel. Dat kan je al, maar het is ook veel werk. Voorbeeld opgave Reken AB16 om naar het binaire stelsel. uitwerking Eerst reken we AB16 om naar het tientallig talstelsel. AB16= 10× 16+ 11× 1= 17110 Nu rekenen we 171 om naar het tweetallig talstelsel. 171 128 43 32 11 8 3 2 1 1 0 - Dat geeft 10101011. Er is echter een hele snelle methode! 27 Daarvoor moet je echter de volgende tabel van buiten kennen (of snel op kunnen schrijven): decimaal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 binair 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 hexadecimaal 0 1 2 3 4 5 6 7 8 9 A B C D E F 28 Stel nu dat je het volgende binaire getal naar het hexadecimaal stelsel wordt omzetten: 110110101011010 Je gaat dan als volgt te werk: stap 1 Maar van achter groepjes van 4 bits (nibbles!): 110 | 1101 | 0101 | 1010 Stap 2 Vul (als dat nodig is het voorste groepje met nullen aan tot 4 bits) 0110 | 1101| 0101 | 1010 stap 3 Zoek nu in de tabel de hexadecimale waarde bij elke nibble. 6D5A klaar! 4.5 Van hexadecimaal naar binair Je kunt de tabel ook gebruiken om snel van hexadecimaal naar binair om te rekenen (zonder de tussenstap via het decimaal stelsel). Je werkt dan in omgekeerde richting. Neem het getal ABC. Zoek voor de cijfer A, B en C de binaire code op en schrijf deze (in dezelfde volgorde) achter elkaar: 1010 1011 1100 Denk er aan dat je steeds 4 bits moet opschrijven, dus 11 wordt 0011! 29 5.1 Mogelijke conversies Je kent nu de volgende talstelsels: binair, decimaal en hexadecimaal. Je hebt gezien hoe je van het ene naar het andere talstelsel om moet rekenen. Met een mooi woord heet dan omrekenen converteren. Omreken heeft alleen zin als je naar een ander talstelsel omrekent. De zes mogelijke - zinnige – omrekeningen staan in de onderstaande tabel opgesomd. Van → naar Binair Binair Decimaal x Hexadecimaal x Decimaal Hexadecimaal x x x x Opgave 5.1.1 Bedenk voor elk van de zes mogelijke omrekeningen drie opgaven en werk deze uit. 30 6.1 Binaire getallen vermenigvuldigen: Arithmetic Shift Als je in het tweetalig stelsel een vermenigvuldiging maakt, doe je eigenlijk hetzelfde als in het decimaal stelsel. Je schrijft de getallen onder elkaar en past het recept toe dat je op de basisschool geleerd hebt. 123 456x Je begint dus met de vermenigvuldiging 6x3, daarna 6x2 etc. Om al deze vermenigvuldigen gemakkelijk te kunnen maken moet je de tafeltjes van 10 van buiten kennen. In het tweetallig stelsel werkt het net zo: 1101 101x Je begint met 1x1, daarna 1x0 etc. De vermenigvuldigen die voor kunnen komen zijn echter heel erg beperkt: 0x0=0 0x1=0 1x0=0 1x1=1 Je hoeft dus alleen maar de tafeltjes van nul en één te kennen! 31 Als je dat bij de bovenstaande vermenigvuldiging uitvoert krijg je het volgende (De drie tussenresultaten tel je bij elkaar): 1101 101x 1101 0 110100+ 1000001 Hieronder staat een vermenigvuldiging die er veel op lijkt uitgewerkt. 1101 111x 1101 11010 110100+ 1011011 Als je naar de drie tussenresultaten kijkt, valt je misschien iets op. Bij de vermenigvuldigingen met 1 komt er telkens 1101 uit, achteraan aangevuld met nullen. 1101 111x 1101 11010 110100+ 1011011 1101 is het eerste getal uit de vermenigvuldig! Kortom, om de tussenresultaten te krijgen hoef je niet eens alle vermenigvuldigingen te maken! Je hoeft alleen het eerste getal naar links te schuiven (het Engelse woord voor schuiven is to shift) en achteraan aan te vullen met nullen. Bij het eerste getal van rechts, nul nullen. Bij het tweede getal van rechts één nul, bij het derde getal van rechts twee nullen. In het algemeen dus bij het n-de getal van rechts, n-1 nullen. 32 Het goede nieuws is dus dat een microprocessor maar twee dingen hoeft te kunnen om te vermenigvuldigen: binaire getallen verschuiven en binaire getallen optellen. Als je dat die bewerkingen op de juiste manier combineert kun je ook vermenigvuldigen. Deze methode heet arithmetic shift. Opgave 6.1.1 Maak de volgende vermenigvuldig met arithmetic shift (zet de getallen onder elkaar). 1101 1010x 33 6.2 Optellingen met méér dan twee binaire getallen Let op bij het optellen van de tussenresultaten moet je soms heel veel getallen (veel regels) bij elkaar tellen. Als je drie tussenresultaten hebt moet je maximaal 3 énen + 1 voor de carry = 4 énen bij elkaar tellen. Hoe moet je dat doen? Methode 1 We bekijken 111+1110+11100: 1 111 1110 11100+ 01 In de derde optelling bereken je 1+1+1+1=410=1002. Je moet de laatste nul opschrijven, maar 10 (=210) onthouden. 21 111 1110 11100+ 001 In deze stap maken we dus de optelling 2+1+1=410=1002. We schrijven dus wederom 0 op en onthouden 10 (=210). 221 111 1110 11100+ 0001 34 In de laatste stap tellen we 2 en 1 bij elkaar: 2+1=310=112. We schrijven 1 op en onthouden 1. 1221 111 1110 11100+ 110001 Kortom. Er moeten soms meer dan 1 onthouden, maar het is niet essentieel anders dan met eenvoudige optelling. Methode 2 Je kunt de optelling ook op een andere manier bekijken. We gaan verder op het punt dat de derde optelling gemaakt wordt: 1 111 1110 11100+ 01 1+1+1+1 = 100. We schrijven 0 op en onthouden 10. 10 1 111 1110 11100+ 110001 35 We gaan dan verder met de vierde optelling. Bij die optelling komt een carry om de hoek kijken. 1 10 1 111 1110 11100+ 110001 NB: Optellen met getallen waarvan het eerste bit het teken is gaat precies hetzelfde. Opgave 6.2.1 Bedenk een vermenigvuldiging van twee binaire getallen van elk 4 bits en voer de berekening uit. 6.3 Nog sneller vermenigvuldigen (extra) Deze paragraaf is geen onderdeel van de toetsstof. Je kunt nu als snel vermenigvuldigen door optellen en verschuiven te combineren. Het kan echter nog veel sneller. Meer kun je daarover lezen op internet: http://en.wikipedia.org/wiki/Booth's_multiplication_algorithm De essentie is dat je lange reeksen enen kunt afkorten. Als je het getal M wilt vermenigvuldigen met 00111110 is dat dus M × (26 + 25+ 24 + 23+ 22+ 21 ) . Je kunt dat sneller berekenen met M × (27 − 21 ) . Een reeks van n opeenvolgende enen kan dus worden vervangen door één optelling én één minsom. 36 7.1 Andere talstelsels (VWO) Wie zegt dat Marsmannetjes niet bestaan? Bij onze laatste ontmoeting bleek dat zij mathematisch uitstekend onderlegd zijn. Maar voordat ik dat begrepen had, heb ik heel wat moeten puzzelen… De tekens waarmee zij hun getallen weergeven, komen in niets overeen met onze cijfers. De volgende tekens bleken de Martiaanse cijfers te zijn. Hun aardse waarde staat ervoor: Aarde 0 1 2 3 Mars Meer tekens gebruiken Marsmannetjes niet. Opgave 7.1.1 a Welke talstelsel gebruikt men op Mars? b Wat is de aardse, decimale waarde van het volgende Martiaanse getal: Kies uit de volgende alternatieven: B 25 C 18 D 212 c Tel de Martiaanse getallen op, die hieronder staan. Noteer de uitkomst in het Martiaans. + 37 7.2 Opteltabellen (VWO) Op deze website kun je een mooie applet vinden waarmee je opteltabellen kunt maken voor verschillende talstelsels: http://www.cut-the-knot.org/blue/SysTable.shtml Opgave 7.2.1 a Bekijk de opteltabel voor het binaire en het decimale stelsel. Welke symmetrie zie je in de tabel? b Probeer nu zonder te spieken de tabel te maken voor het 3, 5 en 7-talligstelsel. c Waarom kun je bij dit applet 'maar' tot het 36-tallig talstelsel gaan? 38 8.1 Zwevende kommagetallen (VWO) Wetenschappelijke notatie Van de wiskunde- en natuurkundelessen ken je de wetenschappelijke notatie. Getallen worden genoteerd met machten van 10. Voorbeelden 12345= 1,2345⋅ 10 4 3,1415= 3,1415⋅ 100 0,0098= 9,8⋅ 10− 3 Een getal kan feitelijk meer dan één manier in wetenschappelijke notatie geschreven worden. 12345= 1,2345⋅ 10 4 12345= 12,345⋅ 10 3 12345= 0,012345⋅ 106 We kiezen er echter voor om altijd maar 1 getal (geen nul!) voor de komma te schrijven. Opgave 8.1.1 Schrijf de volgende getallen in wetenschappelijke notatie 213,978 10000 0,031415 Een getal heeft in de wetenschappelijk notatie dus altijd de vorm: m⋅ 10 e m heet de mantisse 10 is het grondtal 39 e is de exponent Opgave 8.1.2 Geef de mantisse en de exponent van de volgende getallen. Let op: schrijf het getal eerst in wetenschappelijke notatie. − 78,374 10001 0,00857 40 zwevende komma notatie In een CPU zijn er ook registers waarin getallen in een soort wetenschappelijke notatie bewaard kunnen worden. Omdat een computer binair rekent is het grondtal 2, in plaats van 10. Voorbeeld 101⋅ 2 10 Je kunt dit decimaal schrijven als 5⋅ 2 2= 5⋅ 4= 20 We zeggen dat een getal nu genoteerd is in zwevende komma notatie (Engels: floating point). De mantisse is bij zwevende kommagetallen juist geen kommagetal. Opgave 8.1.3 Geef de mantisse en de exponent van de volgende getallen in binaire zwevende komma-notatie. − 1010⋅ 210 111⋅ 2 11 10101⋅ 2 1101 41 8.2 Enkelvoudige en dubbele precisie (VWO) Er zijn internationale afspraken over hoe een zwevend kommagetal in een register opgeslagen wordt. Deze zijn vastgelegd in IEEE 754. Er zijn twee vormen: naam Nauwkeurigheid/ lengte Teken Exponent Mantisse precisie (bits) (bits) (bits) (bits) Single enkelvoudig Double dubbel 32 1 8 23 64 1 11 52 We bekijken dat wat preciezer voor een Single. 1 bit wordt voor het teken gebruikt; 1 staat daarbij voor negatief, 0 voor positief. Daarna staat de exponent waar 127 bij geteld is. -10 wordt dus opgeslagen als -10+127 = +117. Maar dan wel als binair getal. Dan zijn er nog 23 bits over voor de mantisse. Voorbeeld We schrijven het volgend getal als binaire zwevende kommagetal. 7⋅ 23= 111⋅ 211 Het is een positief getal, dus staat er bij het teken een 0. De exponent is 3. Dat slaan we op als 3+127=130. Binair is dat 128+2 → 100000010. Dit zijn al 8 bits, daarom hoeven we niet met nullen aan te vullen aan de voorkant . De mantisse is binair 111. Dat vullen we aan de voorkant met 20 nullen aan tot er 23 bits zijn. Deze drie onderdelen schrijf je in deze volgorde achter elkaar 42 teken | exponent | mantisse decimaal binaire single 7⋅ 23 111⋅ 2 11 0 | 10000010 | 00000000000000000000111 In de uitwerking staan streepjes | tussen de delen van het zwevend kommagetal. In een microprocessor (CPU) staan die er natuurlijk niet tussen. Bij doubles wordt er 211 = 2048 bij de exponent geteld. Opgave 8.2.1 Schrijf de volgende getallen als 32bits single IEEE 754. 123⋅ 2 21 4,56⋅ 2− 10 (hint: maak van de mantisse eerst een geheel getal) − 978⋅ 2− 100 43 9.1 Uitwerkingen Opgave 1.1.1 10 telt voor één op de volgende positie. Bijvoorbeeld: tien keer een eenheid is precies één keer een tiental: 10× 1= 1× 10 n n+ 1 Hetzelfde geldt voor hogere machten: 10× 10 = 1× 10 Bovendien bestaat het getal 10 uit twee cijfers, waardoor niet meer duidelijk is wat met 1010 bedoeld wordt: duizend-tien, of tien tientallen plus tien eenheden (=110) Opgave 2.1.1 Het maakt helemaal niets uit of je 0 koppelt aan open en 1 aan gesloten of omgekeerd. Opgave 2.2.1 2× 2× 2× 2× 2× 2× 2× 2= 28= 256 a b kleinste: 00000000 2= 010 , grootste 111111112= 25510 x 2 verschillende getallen c x d kleinste: 0 , grootste 2 Opgave 3.1.1 Tel de volgende binaire getallen bij elkaar door ze onder elkaar te schijven. Laat zien hoe je aan je antwoord komt. a b c 100101 + 001100 100101 + 011101 101110 + 101010 Opgave 3.2.1 a Bereken –1 + 1 b Bereken 1000000000000001 + 00000000000000001 44 c Reken je antwoord van b om naar het decimale stelsel (let op het eerste bitje!) Opgave 3.2.2 Maak nu de optellingen die hieronder staan. Het zijn steeds bytes, dus als je aan de voorkant een carry overhoudt gooi je dat bitje gewoon weg. Wat valt je op? 00000101 11111011+ 00001001 11110111+ 00010001 11101111+ 00100001 11011111+ 01000001 10111111+ er komt steeds nul uit (met een carry helemaal links) Opgave 3.2.3 Controleer je regel nu aan de hand van de volgende voorbeelden. 00000100 11111100+ 00001000 11111000+ 00010000 11110000+ 00100001 11100000+ 01000001 11000000+ Opgave 3.2.4 Maak de volgende positieve getallen negatief. Het eerst bit staat voor het teken. a b c 0111000 → 1000111+1 → 1001000 0101010 → 1010101+1 → 1010110 0000111 → 1111000+1 → 1111001 Opgave 3.3.1 Oefen nu met de volgende getallen: a b c d e 10001 → -16 + 1 = -15 10011 → -16 + 3 = -13 11111 → -16+15 = -1 11010 → -16 + 10 = -6 11011 → -16 + 11 = -5 45 Opgave 3.3.2 Schrijf de volgende negatieve getallen binair in een Byte Het eerste bit tel je negatief: a b -20 → -128+64+32+8+4 → 11101100 -100 → -128+16+8+4 → 10011100 Opgave 3.3.3 Ga er bij de onderstaande vragen vanuit dat je te maken hebt met getallen van 6 bits waarvan het eerste bit voor het teken staat. a b Hoe schrijf je het getal 0? → 000000 Hoe schrijf je het getal -1? → 111111 Het eerste bit telt negatief -32+16+8+4+2+1 = -1 Opgave 4.2.1 Bedenk zelf 3 getallen in hexadecimale notatie en reken ze naar de decimale notatie om. Opgave 4.3.1 Waarom kun je in plaats van B52 niet 1152 schrijven? 1152 wordt gelezen als 1x4096+1x256+5x16+2x1 en dat is niet gelijk aan 11x256+5x16+2x1 Opgave 4.3.2 Bedenk zelf 3 getallen in decimale notatie en reken ze naar hexadecimale notatie om. 46 Opgave 5.1.1 Bedenk voor elk van de zes mogelijke omrekeningen drie opgaven en werk deze uit. Opgave 6.1.1 Maak de volgende vermenigvuldig met arithmetic shift (zet de getallen onder elkaar). 1101 1010x 11010 0 110100+ 1001110 Opgave 6.2.1 Bedenk een vermenigvuldiging van twee binaire getallen van elk 4 bits en voer de berekening uit. Opgave 7.1.1 a Marsmannetjes tellen viertallig. b 2 Het is 1214= 1× 4 + 2× 4+ 1× 1= 16+ 8+ 1= 2510 , dus antwoord B c Tel de Martiaanse getallen op, die hieronder staan. Noteer de uitkomst in het Martiaans. 10 32+ 102 Opgave 7.2.1 a Bekijk de opteltabel voor het binaire en het decimale stelsel. Welke symmetrie zie je in de tabel? b Probeer nu zonder te spieken de tabel te maken voor het 3, 5 en 7talligstelsel. C 47 Opgave 8.1.1 Schrijf de volgende getallen in wetenschappelijke notatie 213,978 → 2,13978⋅ 10 2 10000 → 1,0⋅ 10 4 0,031415 → 3,1415⋅ 10− 2 Opgave 8.1.2 Geef de mantisse en de exponent van de volgende getallen. Let op: schrijf het getal eerst in wetenschappelijke notatie. − 78,374 → − 78,374 → m=-7,8374, e=1 10001 → 1,0001⋅ 10 4 → m=1,0001, e=4 0,00857 → 8,57⋅ 10− 3 → m=8,57, e=-3 Opgave 8.1.3 Geef de mantisse en de exponent van de volgende getallen in binaire zwevende komma-notatie. − 1010⋅ 210 → m=-1010, e=10 111⋅ 2 11 → m=111, e=11 10101⋅ 2 1101 → m=10101, e=1101 Opgave 8.2.1 Schrijf de volgende getallen als 32bits single IEEE 754. schrijf achter elkaar: teken | mantisse | exponent+127 123⋅ 2 21 → 0 | 10001011 | 00000000000000001111001 4,56⋅ 2− 10 (hint: maak van de mantisse eerst een geheel getal) Deze opgave is ingewikkeld! Je denkt misschien dat de oplossing ligt in 456* 2^-10. Maar dat getal is 100 keer te groot. Honderd is niet te schrijven als macht van twee met een geheel getal als exponent. 48 4,56⋅ 2− 10= 4,56/1024= 0,004453125 Als we dit maar vaak genoeg met twee vermenigvuldig wordt dit een getal net veel cijfers voor de komma. Stel dat we 100 keer met twee vermenigvuldigeden dan is het getal dus 2^100 keer te groot. Daarom met we het met 2^-100 vermenigvuldigen om weer de juiste waarde te krijgen. Je krijgt in principe de nauwkeurigste waarde door zo vaak mogelijk met 2 te vermenigvuldigen, maar de mantisse moet nog in 23 bits passen en de exponent+127 in 8 bits. Stel dat we 0,004453125 met 1024*1024 vermenigvuldigen dan krijgen we: 4669,44*2^-20 dan ronden we af tot 4669*2^-20 dat is wel als single te schrijven (met een lagere exponent wordt het getal nog nauwkeuriger). 0 | 01101011 | 00000000001001000111101 Nu kun je in principe elk getal als single schrijven. Probeer 1,23456 eens! − 978⋅ 2− 100 1 | 00011011 | 00000000000001111010010 49 10.1 Bijlage Deze bijlage is alleen een (veel te ingewikkeld) antwoord op een vraag van Sidney in 2010. Deze bijlage is geen onderdeel van de toetsstof. Een bewijs van de de two's complement-regel Een willekeurige binair getal kan worden geschreven als: x n− 1 x n− 2 x n− 3 ... x 0 x n− 1 , x n− 2 , …, x 0 staan daarbij elk voor een binair getal: een bit. n− 1 De waarde van x n− 1 x n− 2 x n− 3 ... x 0 is ∑ 2i x i . i= 0 Het omgekeerde van een bit of reeks bits noteren we door een streep erboven te zetten. Bijvoorbeeld: 0= 1,1= 0, 10101= 01010 n− 1 De waarde van x n− 1 x n− 2 x n− 3 ... x 0 is als volgt te berekenen: ∑ 2i x i . i= 0 Om het two's complement te maken draaien we alle bits om en tellen er één bij. Voor de waarde telt het linkse bit negatief. n− 2 n− 1 i We kunnen de waarde dus als volgt noteren: − 2 x n− 1+ 1+ ∑ 2 x i . i= 0 merk nu op dat het omgekeerde van één bit genoteerd kan worden als: x= 1− x . Als x= 0 geeft dat x= 0= 1− 0= 1 . Controleer dit zelf voor x= 1 . Dit vullen we in de formule voor de waarde van het two's complement in: 50 n− 2 − 2n− 1 (1− x n− 1)+ 1+ ∑ 2i (1− x i) i= 0 Hieruit werken we de haakjes weg: n− 2 n− 2 n− 2 i= 0 i= 0 i=0 − 2n− 1+ 2n− 1 x n− 1+ 1+ ∑ 2 i− 2 i xi = − 2n − 1+ 2n − 1 x n− 1+ 1+ ∑ 2i− ∑ 2i x i n− 2 We weten echter dat 2i= 2n− 1− 1 , ∑ i= 0 zodat n− 2 − 2n− 1+ 2n− 1 x n− 1+ 1+ 2n − 1− 1− ∑ 2i x i . i= 0 Als we hierin gelijke termen tegen elkaar laten wegvallen krijgen we n− 2 2 n− 1 x n− 1− ∑ 2i x i . i= 0 Als we nu een minteken buiten haken halen krijgen we precies: n− 2 − (− 2n − 1 x n− 1+ ∑ 2i x i ) . Dit is de negatieve waarde van i= 0 n− 2 − 2n− 1 x n− 1+ ∑ 2i x i . In deze laatste formule staat de waarde van een binair i=0 getal met teken. Voor een positief getal is x n− 1= 0 , en valt de eerste term dus weg. Voor een negatief getal ( x n− 1= 1 ) staat hier precies de regel die bij het lezen van negatieve getallen beschreven werd: tel het linkse bit negatief en de rest positief. Kortom: we hebben nu voor een willekeurige bitrij bewezen dat het two's complement de negatieve waarde heeft van die bitrij. 51