Så vidt jeg kan se, så er den jo næsten indbygget:
Lav en konstant af typen char, på 16 tegn, med tallene
'0123456789ABCDEF', og så kan du jo nemt omsætte fra decimal til hex, så
længe du holder dig til en hexdigit.
Hvis du har brug for flere, så kan du definere et array, hvor du gemmer
dem af to tegn: ('00', '01', '02',..., 'FF') - og så skulle det vist
også være nemt. Det fylder ca. 512 bytes konstanter (gemmes sammen med
kode). Og så kan du jo også nemt, skrive enhver byte ud som hex, eller
bruge lo(x) og hi(x) for at "sammensætte" to konverterede hexbytes til
et word, eller en integer med koden hex[hi(x)]+hex[lo(x)] og så er det
jo nemt nok. Naturligvis, så kan du også fortsætte, og gøre det med 32
bits longinteger osv. Så det skulle vist ikke give nogen problemer.
Fordelen ved at lave ovenstående variabel på 512 tegn, er at det ofte er
en meget hurtig måde at omsætte til hexidecimal, altså det anvendes
meget få computer resourcer. Kun et par opslag i ram'en, der læses som
32 bit, er nok. Det vil dog nok være ligeså godt i maskinkode på en ny
PC, fordi at den har indbygget cache i processoren. Men hvis du ikke vil
anvende en konstant til det, så kan du jo også bruge en af de andre
metoder, hvor at man returnerer med chr(x+48) for x<=9, og chr(x+55) når
x er i intervallet fra 10 til 15 (for en digit kun) og på grund af
cachen, går det også hurtigt idag. Men den metode med at slå op i ram,
er faktisk hurtigst på nogle computere, også nogen af de gamle, hvor
ram'en var hurtig, og der ikke var cache i cpu'en (ved hele bytes.) Det
mest overskuelige er dog at anvende konstanter, enten en på 512 bytes,
som tager "bytes" direkte og omsætter til hex, eller en på kun "en
digit" som førhen på zx81, der jo kun havde 256 bytes fri. Naturligvis,
så kan man anvende hexdig[x shr 4]+hexdig[x and 15] for at anvende den
lille konstant på kun en digit, hvis den skal kunne bruges til en hel
byte. Jeg syntes dog, at en defination af en konstant for hele byte
området er mere overskuelig i programmet, i stedet for at lave
operationer som shift, og "and". Og måske enda også ligge "magiske tal"
som 48 eller 55 til, hvilket i øvrigt heller ikke er så kompatibel, hvis
compilerne anvender forskellige andet end ascii, som jo så ikke
nødvendigvis har tal og bogstaver til at ligge i rækkefølge (bcd like
formater.) Så nu er det bare, at gå igang med at skrive alle hexciffer
op fra begyndelsen af, og lægge dem ind. Enten som byte, hvilket jeg
syntes er smart af hensyn til programmets overskuelighed, eller som
"hexidecimal" og så altså til at anvende shr 4, og and 15. Det at
anvende en lille konstant på kun 16 tegn, kan måske også gøre den
interne brug af cachen mere effektiv, da at man jo så ikke optager hele
512 bytes her, med denne omsætningsfunktion. 512 bytes i lageret er jo
intet i nutidens dage.
--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"