Basesystemer som binær og hexadecimal virker i første omgang lidt mærkelige. Nøglen er at forstå, hvordan de forskellige systemer “tikker over” ligesom et kilometertæller, når de er fulde. Base 10, vores decimalsystem, “tikker over”, når det får 10 poster, hvilket skaber et nyt ciffer. Vi venter 60 sekunder, før vi “tikker over” til et nyt minut. Hex og binært system ligner hinanden, men tikker over for henholdsvis hver 16. og hver 2. post.
Forsøg at konvertere tal til hex og binært system her:
Der var engang: Unary Numbers
Helt tilbage i tiden havde vi ikke basissystemer! Det var op ad bakke begge veje, gennem sne og brændende varme. Når man ville tælle 1, skrev man:
l
Når man ville have 5, skrev man
lllllll
Og det er klart, 1 + 5 = 6
l + lllllll = llllllll
Det er den enkleste måde at tælle på.
Ind i romerne
I de romerske tal var to en, to gange. Tre var en, tre gange:
one = Itwo = IIthree = III
Men de besluttede, at de kunne gøre det bedre end den gamle tradition med streger i sandet. For fem kunne vi bruge V til at repræsentere lllll og få noget i stil med
l + V = Vl
Ikke dårligt, vel? Og der er naturligvis mange flere symboler (L, C, M osv.), man kan bruge.
Det vigtigste punkt er, at V og lllllll er to måder at kode tallet 5 på.
Et andet gennembrud var at indse, at hvert tal kan være sit eget særskilte begreb. I stedet for at repræsentere tre som en serie af ettere, skal man give det sit eget symbol: “3″. Gør dette fra et til ni, og du får symbolerne:
1 2 3 3 4 5 6 7 7 8 9
Romerne var tæt på, så tæt på, men gav kun unikke symboler til 5, 10, 50, 100, 1000 osv.
Brug din position
Nu er det klart, at du ikke kan give hvert tal sit eget symbol. Der er simpelthen for mange.
Men læg mærke til en indsigt om romerske tal: de bruger symbolernes position til at angive betydningen.
IV betyder “trække 1 fra 5″
og VI betyder “lægge 1 til 5″.
I vores talsystem bruger vi position på en lignende måde. Vi lægger altid til og trækker aldrig fra. Og hver position er 10 mere end den foregående.
Vores valg af base 10
Hvorfor har vi valgt at gange med 10 hver gang? Højst sandsynligt fordi vi har 10 fingre.
Et punkt, man skal gøre sig klart, er, at man har brug for nok cifre til at “fylde op”, indtil man rammer det næste tal. Lad mig demonstrere.
Hvis vi ønsker at rulle kilometertælleren over hver 10. gang, så at sige, har vi brug for symboler for tallene et til ni; vi er ikke nået ti endnu. Forestil dig, at tallene tikker langsomt opad – på hvilket tidspunkt vender du den næste enhed om og starter fra ingenting?
Indtast nul
Og hvad sker der, når vi når ti? Hvordan viser vi, at vi vil have præcis ét “ti-tal” og intet i kolonnen “et-taller”?
Vi bruger nul, tallet, der ikke findes. Nul er noget af et begreb, det er en pladsholder, et tomrum, et mellemrum og en hel masse andet. Det er tilstrækkeligt at sige, at nul er en af alle tiders store opfindelser.
Nul giver os mulighed for at have en tom pladsholder, noget som romerne ikke havde. Se, hvor uoverskueligt deres tal er uden det.
George Orwells berømte roman “1984″ ville være “MCMLXXXIV”! Det er lige til at gå i munden, ikke sandt?
Tænk på andre baser
Husk, at vi valgte at rulle vores kilometertæller over hver tiende. Vores tælling ser således ud:
123456789 (uh oh, I'm getting full!)10 (ticked over – start a new digit)
Hvad nu hvis vi tæller over ved 60, når vi tæller, ligesom vi gør for sekunder og minutter?
1 second2345…58591:00 (60 seconds aka 1 minute. We've started a new digit.)
Alt er okay indtil videre, ikke? Bemærk, at vi bruger kolon (:) for at angive, at vi er nået til et nyt “ciffer”. I base 10 kan hvert ciffer stå for sig selv.
Prøv base 16
Hvis vi vil have base 16, kan vi gøre noget lignende:
123456789101112131415 (we're getting full)1:00 (16 – we've started a new digit)
Men vi ønsker ikke at skrive hexadecimaltal med kolon-notationen (selv om vi kunne). Vi vil hellere lave separate symboler for 10-15, så vi bare kan skrive tal, som vi er vant til. Vi er løbet tør for tal (1-9 er allerede brugt, med 0 som pladsholder), så vi har brug for nogle andre symboler. Vi kunne bruge nogle snørklede linjer eller andre former, men det er almindeligt at bruge bogstaver i romersk stil. Ligesom 5 blev til V, bruger programmører bogstaverne A-F for at få nok cifre op til 16. Det vil sige,
123456789A (10 – we're using the symbol "A")B (11)C (12)D (13)E (14)F (15 – uh oh, we're getting full)10 (16 – we start a new digit)
Ahah! Nu kan vi bruge et ciffer pr. “sted”, og vi ved, at 10 faktisk betyder, at vi har “krydset over til 16″ én gang.
20 betyder, at vi har krydset over til 16 to gange (32).
25 betyder, at vi har krydset over til 16 to gange (hvilket giver os 32) og er gået en ekstra 5. Det giver i alt 32 + 5 = 37.
Snakkere gennemgang
Er du med mig indtil videre? Det her er ret fedt, ikke? Vi kan tælle i hvilket som helst system vi vil. Læg også mærke til, at base 16 er mere “pladsbesparende” i den forstand, at vi kan skrive et tal som 11 i et enkelt ciffer: B.
Base 16 er egentlig ikke så forskellig fra base 10, vi er bare længere tid om at fylde op.
Den vidunderlige verden af binære
Vi har set masser af basissystemer, fra det alt for simple unære system til de ufleksible romertal, det stabilt løbende base 10 og det kompakte base 16.
Hvad er det fantastiske ved binære? I en ånd af at holde tingene enkle er det det det enkleste talsystem, der har begrebet “tikkende over”. Unært, hvor vi bare skriver 1, 11, 111 … fortsætter bare i det uendelige. Binært, med to muligheder (1 og 0) ser således ud:
1: 12: 10 (we're full – tick over)3: 114: 100 (we're full again – tick over)5: 1016: 1107: 1118: 1000 (tick over again)…
og så videre.
Da binært er så simpelt, er det meget nemt at bygge i hardware. Man har blot brug for ting, der kan tændes eller slukkes (som repræsenterer 1 og 0), i stedet for ting, der har 10 mulige tilstande (for at repræsentere decimaltal).
Da det er så simpelt, er binært også modstandsdygtigt over for fejl. Hvis dit signal er “delvist tændt” (lad os sige 0,4), kan du antage, at det er et nul. Og hvis det er overvejende tændt (lad os sige 0,8), kan du antage, at det er en 1. Hvis du bruger et system med 10 mulige tilstande, er det svært at se, hvornår der er opstået en fejl. Det er en af grundene til, at digitale signaler er så modstandsdygtige over for støj.
Andre eksempler på baser
Vi bruger andre baser hele tiden, selv dynamisk skiftende baser. Vi tænker normalt ikke på det på den måde:
Steder, minutter, sekunder: 1:32:04
- Vi ved, at dette er 1 time, 32 minutter og 4 sekunder. I sekunder er det 16060 + 32*60 + 4.
Fod og tommer: 3′ 5″
- Dette er 3 fod, 5 tommer eller 3 * 12 + 5 tommer.
Pund og ounces: Dette er 3 fod, 5 tommer eller 3 * 12 + 5 tommer: 8 lbs, 5 oz
- Da et pund er 16 oz, er dette 8 * 16 + 5 oz. Vi har hele tiden brugt et talsystem med base 16!
Tilbagevendende tanker
“10″ i et talsystem angiver basen og betyder, at vi har krydset over én gang. 10 i binær betyder to, 10 i decimal betyder ti, og 10 i hexadecimal er seksten.
Hvordan holder man disse tal adskilt? Programmører vil ofte skrive “0b” foran binære tal. Så 2 i binær er
0b10
Sådan skriver de 0x foran hexadecimale tal. Så 16 i hextal er:
0×10
Hvis der ikke er nogen symboler (0b eller 0x) foran, antager vi, at det er base 10, et almindeligt tal.
Så gå nu ud og nyd din nye viden!
Andre indlæg i denne serie
- Talsystemer og baser
- Snavguide til GUID’er
- Forståelse af Quakes hurtige omvendte kvadratrod
- En simpel introduktion til computer Netværk
- Swap to variabler ved hjælp af XOR
- Forståelse af Big og Little Endian Byte Order
- Unicode og dig
- En lille diddy om binære filformater
- Sorteringsalgoritmer