HEXADECIMAAL - HANDEN MET ACHT VINGERS ( In het volgende betoog wordt uitgegaan van het feit, dat elk getal tot de macht 0 is 1 ) De getallen die we gebruiken zijn gerangschikt volgens een bepaald systeem. Zo'n systeem heet een getallen-stelsel. Theoretisch kunnen dat er bijna oneindig veel zijn. Bij ons is toevallig gekozen voor het Decimale stelsel. In de praktijk wordt ook nog veel gebruik gemaakt van het Binaire en Hexadecimale stelsel. Eerder in computers ook nog wel van het Octale stelsel. Binair = Twee-tallig Decimaal = Tien-tallig Hexadecimaal = Zestien-tallig De beschrijving van de getallen wordt dus zeer bepaald door de Machten Van. Want de positie van een cijfer in een getal bepaalt de macht van het grond-getal. Dus de uiteindelijke betekenis. Bij decimaal '40' betekent die '4' niet 4 maar 40. ( De positie van de 'eenheden' is bij ons uiterst rechts, maar kan in andere talen ook omgekeerd zijn, dat maakt niet uit voor de volgorde-regels ) Indien de posities vanaf de 'eenheden' een nummer wordt gegeven, beginnend met 0, dan betekent dat een hoeveelheid, gelijk aan : Grondgetal tot de Macht nummer-positie. Bij Decimaal is het grondgetal '10'. (Er zijn immers 10 tekens). Neem het decimale getal 40. Die '4' op positie-nummer 1 wordt dan 4 maal (10 tot de Macht 1) = 4 x10 = 40. Die '0' van '40' staat op positie-nummer 0, dus dat is 0 maal (10 tot de Macht 0) = 0x1 = 0. Alle positie-hoeveelheden worden bij elkaar opgeteld en geven het uiteindelijke getal. Bij Hexadecimaal geldt dus grondgetal = 16. (Er zijn immers 16 tekens) Neem hexgetal '40' (vaak ter onderscheid aangeduid als '40h'). Dus die '4' op positie-nummer 1 wordt dan 4 maal (16 tot de Macht 1) = 4 x16 = 64. Binair heeft dus maar maar twee mogelijke tekens beschikbaar : 0 en 1. Decimaal heeft er tien : 0 tot 9. Hexadecimaal heeft zestien tekens: 0 tot 9 plus A tot F. 'B' is dus elf en 'F' is vijftien. Random gekozen voorbeeld : het getal '141'. Op zich is niet duidelijk te zien met welk getallenstelsel dat getal wordt uitgedrukt. De decimale vertaling is, van R naar L : 1x1 + 4x10 + 1x100 = 141 De hexadecimale vertaling zou zijn : 1x1 + 4x16 + 1x256 = 321 Een binaire interpretatie kan niet, omdat in dat stelsel de '4' ontbreekt. Een octale vertaling kan wel en wordt dan : 1x1 + 4x8 + 1x64 = 97. Octaal : het is aan de lezer om uit te vogelen hoe dat in elkaar zit. Het octale stelsel blijkt nog gebruikt te worden in de permissie-codes van bestanden en directories op een UNIX-server. Om uit te maken in welk stelsel een getal is beschreven wordt bijv. een hex-getal dus geschreven als '141h'. Die toevoeging maakt de efficiency een stuk kleiner, omdat er een extra teken nodig is. Decimaal zou het eigenlijk '141d' moeten zijn, maar dat mag kennelijk worden weggelaten door de suprematie van het decimale stelsel. Volgorde. Elke 'digit' is een 'teken' in de reeks van een 'getal'. Binair kan elke digit slechts 0 of 1 zijn. Zo'n digit wordt een 'bit' genoemd. Om tot 16 te tellen (0-15) kost dat 4 'bits' en heet een 'nibble'. Hexadecimaal kan een digit 0 tot F zijn. De set van de ASCII-code heeft 256 tekens. Dat heeft dus 2 hex-digits nodig. Van 00h tot FFh. Van 00000000 tot 11111111 . Dus 8 bits en dat heet een 'byte'. Bits, Bytes, Words. Een groep van 1 tot 8 bytes wordt een 'wo(o)rd' genoemd. Hoe groot dat 'word' is, is afhankelijk van wat de processor aankan. 'Oude' 386-machines werkten met 8-bits data-bussen, dus 0 - 256 opties. Huidige Pentiums zijn al 32-bits dus met words van 4 bytes. Spelcomputers van nu kunnen al werken met een bus-breedte van 128 bits. Dat betekent een resolutie van 0 - 1073741824 bytes. Helaas wordt in het spraakgebruik meestal niet 'word' gebruikt, maar 'byte', wat de duidelijkheid niet ten goede komt : 'Een harde schijf van 20 Gigabytes' of 'een geheugen van zoveel Megabytes'. Het woord 'byte' is voor het eerst gebruikt door ene Werner Buchholz, om verwarring met de term 'bit' te vermijden, terwijl hij bezig was met de codes voor karakters, omdat toen (1956) 8-bits mogelijk werd. Kleurcode. In een HTML-file kan een variable worden bepaald voor een kleur. Van een font, een achtergrond of een link. Dit kan met een string zoals 'black', maar ook met een kleurcode. Ter aanduiding begint dat met een 'hekje'. (jammer genoeg ook weer een extra teken in de data) Die kleurcode bestaat uit drie 'bytes', dus drie maal 00 - FF, voor de info over de drie basis-kleuren Rood - Groen - Blauw. RGB. Zwart is dan #000000 en wit is dan #FFFFFF. Hieruit volgt : Wil je puur rood, dan wordt het FF0000, Hieruit volgt ook : Wil je een gradatie grijs, zorg dat de 3 words dezelfde waarde hebben, dus voor iets meer dan half grijs bijv. 909090. Daar volgt weer uit, dat een gemeenschappelijke verhoging een 'verlichting' betekent. Dus wil je lichter rood dan FF0000, probeer dan FF4040 . Tip : wil je geel, begin dan met RG, oftewel FFFF00. Andere combinaties lijken me meer vanzelfsprekend qua resultaat. Paars bijv. Extra teken. Die toevoeging van 'h' aan een hex-getal en vooral het weglaten van die 'd' bij een decimaal getal kan ik me nog wel voorstellen voor het dagelijks leven. Maar als dit in computer-taal gebruikelijk blijkt, om dit per geval te verklaren, blijft dit een zogenaamde 'local variable'. De 'h' of het hekje. Dit kan beter in de programmering. Er zou een declaratie kunnen zijn voor een 'global variable', die stelt dat alle getallen, die in de relevante routine gebruikt worden, geacht worden hexadecimaal te zijn. Dat scheelt weer een teken. De Nul. Het decimale systeem maakt gebruik van de cijfers 0 t/m 9. Dus niet 1 t/m 10 ... Het verschil in interpretatie maakt gauw fouten. Een decimale weergave van twee decimale digits heeft een range van 100 verschillende getallen, maar telt van 00 t/m 99. In hexadecimaal is FF niet 256, maar 255. Het verschil tussen 'het aantal mogelijke combinaties' en 'het grootste getal'. Dit aspect zou veel duidelijker al in het basisonderwijs moeten worden benadrukt bij de introductie van 'rekenen' : Het bestaan en gebruik van de 0. De nul kan dan ook zorgen voor begrip van een symmetrisch getallenstelsel, bestaande uit positieve en negatieve getallen, wat het concept 'min' al een stuk makkelijker maakt. Beginnen met alleen positieve getallen geeft een a-symmetrisch beeld. Opbouw. Het meest rechtse cijfer van een getal is de '1-heid', decimaal dus 10 tot de macht 0. Het cijfer links daarvan is het '10-tal', decimaal dus 10 tot de macht 1. Daarnaast '100-tal' enz. Bij decimaal is het gebruikelijk om overbodige nullen aan de linkerkant van het getal weg te laten. Dus niet 00000032 maar 32. Bij andere stelsels zal dat niet altijd compleet kunnen. Als er een 'byte' vereist is moet er voor decimaal 5 echt 05h staan. Binair : 0000 0101 (die spatie wordt vaak gebruikt om het leesbaar te houden en om een binair naar hex-conversie makkelijker te maken.) Bij binair is het het meest duidelijk : de nul heeft evenveel rekenfunctie als de 1. Gebruik. Iedereen heeft met elk stelsel een grens van getalgrootte, waarbij nog uit het hoofd gerekend kan worden. Die grens zal meestal van decimaal wat groter zijn, dan met andere stelsels, omdat we daarmee worden opgevoed. Die grens wordt mede bepaald door de frequentie van de dagelijkse confrontatie ermee. Voor alle getallen die ons 'te groot' zijn, komt dus een papiertje of een calculator. Ik ben wat gewend aan hexadecimaal, dus ik weet uit mijn hoofd dat 14 'E' is. Bij 'C6h' gaat hoofdrekenen nog net : 12 maal 16, plus 6 maal 1. Van sommige weet ik het nog wel uit mijn hoofd : 80h = 128 en FFh = 255. De moeilijkheid van het gebruik wordt makkelijker door in de geschreven structuur punten, komma's of spaties te zetten. Bijv. die 0000 0101, of 4.106.000 Conversie. Er is een verschillend grondgetal van het 'brongetal' en het 'doelgetal'. Het grondgetal bijv. van binair is 2, van decimaal 10 en van hexadecimaal 16. Basis principe : Zoek het hoogste veelvoud van de hoogst mogelijke macht van het doel-grondgetal, dat minder is dan, of gelijk aan, het brongetal. Noteer het cijfer van dat veelvoud. Verminder het brongetal met de totale uitkomst van dat veelvoud. Maak de rest tot het nieuwe brongetal en herhaal de procedure tot er nul over is. (met het nadruk op het feit dat elke berekening zelf, in het 'native' decimale gebeurt) ---- Dus : 114 decimaal naar hexadecimaal : Zoeken : 16 in het kwadraat is 256 en valt dus af. 16 tot de eerste = 16 blijft dus over. Macht-getal is dus 1. Veelvoud ? Hoeveel keer 16 is nog onder 114 ? Blijkt 7. Schrijf dus 7. Uitkomst van dat veelvoud 7 x 16 = 112. Dat van 114 af geeft 2, Hoeveel keer 1 is minder dan of gelijk aan 2 ? Blijkt 2. Schrijf dus 2. Aan de rechterkant van die 7. Rest = 0 - stop. 114 decimaal is dus 72 hexadecimaal. ---- Dus : 114 decimaal naar 8-bits binair : ('Veelvouden' per digit hier niet aan de orde dus) Zoeken : 2 tot de 7e macht is 128. 128 valt niet binnen 114. Schrijf een 0. 2 tot de 6e macht is 64. 64 valt binnen 114. Schrijf een 1. Bij een 1 wordt het van het origineel afgetrokken : 114 - 64 = 50. 2 tot de 5e is 32. Valt binnen 50. Schrijf een 1. 50 - 32 = 18. 2 tot de 4e is 16. Valt binnen 18. Schrijf een 1. 18 - 16 = 2. 2 tot de 3e is 8. Valt niet binnen 2. Schrijf een 0. 2 tot de 2e is 4. Valt niet binnen 2. Schrijf een 0. 2 tot de 1e is 2. Valt binnen 2. Schrijf een 1. 2 - 2 = 0. 2 tot de 0e is 1. Valt niet binnen 0. Schrijf een 0. Stop. 114 decimaal is dus 01110010 binair. Sorteren. Bij de weergave van bestanden op de computer in een directory staat meestal de sorteermethode default op alfabetisch van boven naar beneden. (gescand per karakter van links naar rechts in de string : naam - extensie) Eigenlijk is dat meer dan alfabetisch. Omdat het gebruik maakt van de ASCII-tabel, dus veel meer tekens bevat. Zo komen de cijfers 0 t/m 9 voor a t/m z. Dus het bestand '2tired.html' zal niet alleen boven 'tired.html' staan, maar ook boven 'apa.html'. De ASCII-set heeft ook leestekens. De meeste komen na het standaard alfabet en de hoofdletters daarvan, maar sommige staan eerder in de tabel dan 0 t/m 9. Dat zijn in wezen alle leestekens, die rechtstreeks toegankelijk zijn via het KB. Het gebruik daarvan heeft restricties, afhankelijk van het protocol van de omgeving, maar in een lijst van te openen bestanden zal '!aap.html' dus boven 'aap.html' staan. Evenals bijv. een understrike of een plus-teken. Dit is manipulatie naar boven toe. Manipulatie van wat 'er onder' moet, kan ook met gebruik making van de ASCII-tabel. Bij de reeks 'frame1.jpg' tot 'frame10.jpg' zou de weergave van boven naar beneden zijn : frame1.jpg - frame10.jpg - frame2.jpg - frame3.jpg etc. (frame4 - 9). Door de bestanden frame1.jpg t/m frame9.jpg te hernoemen tot frame01.jpg t/m frame09.jpg komen ze alsnog in de juiste volgorde komt te staan : frame01 t/m ..10. In dit geval komt het hexadecimale formaat van pas. Dan is het voldoende om bestand 'frame10.jpg' te hernoemen tot 'framea.jpg' en de sorteerweergave is correct, omdat de 'a' na de '9' komt in de ASCII-tabel. Gewenning. Evenals bij het decimale zal bij het gebruik van binaire of hexadecimale systemen sommige 'makkelijke' of veelgebruikte getallen in het brein komen te zitten evenals bepaalde ezelsbruggetjes of clues. In hex zal men na korte tijd al onbewust het getal '80h' herkennen als de helft van '100h'. En weten dat het '128d' is. En 'FFh' decimaal '255' is. Of dat de helft van 4Ch 26h is, omdat je dan weet, dat C decimaal 12 is. En dat 'FFh' binair '1111 1111' is. Of dat binair '1010' decimaal '10' is, door het 'tien-tien'. En dat 2 tot de macht 10 '1024' is, omdat daar ook een 'tien' staat. Dit kunnen 'bruggetjes' zijn naar andere getallen. Zo zul je bij binair '1111 1110' snel kunnen bepalen dat dat dan in hex wel 'FE' zal zijn. Of, nog uit het hoofd, dat dan 2 tot de 11e wel 2 x 1024 = 2048 zal zijn. Uitbreiding. Zijn er getallensystemen met een hogere resolutie dan hexa-decimaal ? Oftewel een grondgetal hoger dan 16 ? In feite is de ASCII-tabel een vanzelfsprekende optie hiervoor. 256 verschillende karakters in plaats van 16. Helaas levert dat bij de weergave problemen op, door de verschillende locaal ingestelde ASCII-sets. Maar de Alt-codes blijven natuurlijk wel hetzelfde. Ik kan op de 'x'-toets drukken, maar teken '120' in de ASCII-set geeft ook een 'x'. Je zou kunnen zeggen, dat er al van dit hogere getallensysteem wordt uitgegaan bij het gebruik van 'strings' in bijv. wachtwoorden, registratie 'keys' of andere codes. Dat levert dus getallen op met een 'machtsgetal' van 256, waaruit vergeleken kan worden. In de praktijk zal de ASCII-tabel voor de weergave weinig bruikbaar zijn, omdat sommige tekens ervan ook een commando betekenen, zoals voor telex, of zoals de '10' voor een regelomhaal .. Of het feit dat zowel '32' als '255' een spatie in de string oplevert. In de praktijk wordt de ASCII-tabel al wel gebruikt voor berekeningen, zoals bij de PGP-encryptie van data. Daar zijn in principe 2 'strings', waarmee een reken-formule wordt uitgevoerd, voor de encryptie en decryptie. ---