Talsystemkonverteringer
Når vi skriver programmer til mikrocontrollere, er vi normalt nødt til at håndtere 3 forskellige talsystemer: decimaltal, binærtal og hexadecimaltal (eller hex). Vi bruger decimaltal, fordi det kommer naturligt; det er den måde, vi tæller på. Desværre er det ikke den måde, som computere tæller på. Da computere og mikrocontrollere er begrænset til 1’er og 0’er, tæller de ved hjælp af sekvenser af disse tal. Dette er det binære talsystem. Binære tal er som regel forsynet med “0b”-tegn, som ikke er en del af tallet. Nogle gange er de også underopdelt i grupper af 4 cifre for at gøre dem lettere at læse og nemmere at relatere til det hexadecimale talsystem. Et eksempel på et binært tal er 0b0100.1011. Punkterne i tallet repræsenterer ikke noget, de gør det bare lettere at læse tallet.
Det binære system er enkelt at forstå, men det kræver mange cifre at bruge det binære system til at repræsentere store tal. Det hexadecimale system kan repræsentere meget større tal ved hjælp af færre tegn, og det minder meget om binære tal. Hexadecimale tal er normalt forsynet med tegnene “0x”, som ikke er en del af tallet. Et enkelt hexadecimalt ciffer kan repræsentere fire binære cifre!
Binære tal kan kun bestå af 1’er og 0’er; typisk består et binært tal af 8 cifre (eller et multiplum af 8), hvis det bruges i en slags computer (eller mikrocontroller). Det er nyttigt at vide, hvordan man konverterer et binært tal til et decimalt tal og omvendt. Så hvordan konverterer vi mellem talsystemer? Først skal vi overveje, hvordan vi bestemmer værdien af et decimaltal. Tallet 268 kan opdeles som 200 + 60 + 8, eller 2 * (10^2) + 6 * (10^1) + 8 * (10^0). Der er to vigtige tal, som vi skal kende for at “dekonstruere” tallet – basen i talsystemet og placeringen af cifferet i tallet. Basen for et decimaltal er 10. Når vi omdanner tallet 268, er 2 det andet ciffer, 6 er det første ciffer, og 8 er nulcifferet. Hvert ciffer skal skaleres i forhold til dets placering i tallet. Ciffets skala er talsystemets base hævet til potensen af ciffets placering i tallet. Hvert tal skaleres altså, og derefter lægges alle de skalerede cifre sammen for at finde talets samlede værdi.
Den samme metode kan bruges til at finde værdien af et binært tal. Lad os f.eks. se på tallet 0b1011.0101. Basen i det binære system er 2 (præfikset 0b bruges ofte i kode for at angive, at tallet er i det binære format). Værdien af vores tal er: 1*(2^7)+0*(2^6)+1*(2^5)+1*(2^4)+0*(2^3)+1*(2^2)+0*(2^1)+1*(2^0), hvilket er lig med 181.
0b1011.0101. Sikke en fuldstændig ineffektiv måde at skrive et tal på! Men vi kan repræsentere det samme binære tal ved hjælp af kun 2 hexadecimale cifre. Først skal vi dog starte med at konvertere et hexadecimalt (hex) tal til decimaltal, ligesom vi gjorde for et binært tal. Hvad med 0xB5? Vent, hvad?! Præfikset 0x bruges i kode for at angive, at tallet skrives i hexadecimaltal. Men hvad laver “B” derinde? Det hexadecimale format har en base på 16, hvilket betyder, at hvert ciffer kan repræsentere op til 16 forskellige værdier. Desværre løber vi tør for numeriske cifre efter “9”, så vi begynder at bruge bogstaver. Bogstavet “A” repræsenterer 10, “B” er 11, “C” er 12, “D” er 13, “E” er 14 og “F” er 15. ‘F’ er det største ciffer i det hexagonale talsystem. Vi konverterer tallet på samme måde som før. Værdien af 0xB5 er altså: B*(16^1)+5*(16^0) eller 181.
Det er vigtigt at vide, hvordan man konverterer binært og hex til decimaltal, men den mest nyttige talkonvertering er sandsynligvis konvertering mellem hex og binærtal. Disse to talsystemer fungerer faktisk ret godt sammen. Nummereringssystemerne hænger tilfældigvis sammen på en sådan måde, at et enkelt hex-ciffer repræsenterer præcis 4 binære cifre, og således kan 2 hex-cifre repræsentere 8 bits (eller binære cifre). Her er en tabel, der viser, hvordan hvert hex-ciffer er relateret til det binære system:
Binær værdi | Hex-værdi | |
0000 | 0 | |
0001 | 1 | |
0010 | 2 | |
0011 | 3 | |
0100 | 4 | |
0101 | 5 | |
0110 | 6 | |
0111 | 7 | |
1000 | 8 | |
1001 | 9 | |
1010 | A | |
1011 | B | |
1100 | C | |
1101 | D | |
1110 | E | |
1111 | F |
Til eksempel, for at konvertere det hexagonale tal 0x1C til binært, skal vi finde den tilsvarende binære værdi for 1 og C og kombinere dem. Så 0x1C i binær form er 0b0001.1100. Hvis vi ønskede at finde ud af hex-værdien for et binært tal, går vi bare den anden vej. For at finde hex-repræsentationen af det binære tal 0b0010.1011 finder vi først hex-værdien for 0010, derefter hex-værdien for 1011 og kombinerer dem; hex-værdien ville være 0x2B.
Der er mange gratis værktøjer til rådighed til at hjælpe med at konvertere mellem disse talsystemer, bare google ‘hex number conversion’. Hvis du bruger Windows som styresystem, har du et fantastisk værktøj indbygget i lommeregneren. Du skal blot ændre lommeregneren til videnskabelig tilstand, og du kan konvertere mellem talsystemer ved at skrive et tal og derefter ændre formatet på lommeregneren!