Basystem som binära och hexadecimala system verkar lite konstiga till en början. Nyckeln är att förstå hur olika system ”tickar över” likt en vägmätare när de är fulla. Bas 10, vårt decimalsystem, ”tickar över” när det får 10 poster, vilket skapar en ny siffra. Vi väntar 60 sekunder innan vi ”tickar över” till en ny minut. Hex och binär är liknande, men tickar över var 16:e respektive 2:e punkt.
Try converting numbers to hex and binary here:
Way back when: Unary Numbers
Förr i tiden hade vi inga bassystem! Det var uppförsbacke åt båda hållen, genom snö och brinnande hetta. När du ville räkna ett skrev du:
l
När du ville ha 5 skrev du
lllllll
Och det är klart att 1 + 5 = 6
l + lllllll = llllllll
Detta är det enklaste sättet att räkna.
Inför romarna
I romerska siffror var två ett, två gånger. Tre var ett, tre gånger:
one = Itwo = IIthree = III
Hur som helst bestämde de sig för att de kunde göra bättre än den gamla traditionen med linjer i sanden. För fem kunde vi använda V för att representera lllll och få något som
l + V = Vl
Inte dåligt, va? Och naturligtvis finns det många fler symboler (L, C, M osv.) som man kan använda.
Den viktigaste punkten är att V och lllll är två sätt att koda talet 5.
Giv varje tal ett namn
Ett annat genombrott var att inse att varje tal kan vara ett eget distinkt begrepp. Istället för att representera tre som en serie ettor, ge det en egen symbol: ”3″. Gör detta från ett till nio och du får symbolerna:
1 2 3 4 5 6 7 8 9
Romarna var nära, så nära, men gav bara unika symboler till 5, 10, 50, 100, 1000 osv.
Använd din position
Nu är det uppenbart att du inte kan ge varje tal en egen symbol. Det finns helt enkelt för många.
Men lägg märke till en insikt om romerska siffror: de använder symbolernas position för att ange betydelsen.
IV betyder ”subtrahera 1 från 5″
och VI betyder ”addera 1 till 5″.
I vårt siffersystem använder vi position på ett liknande sätt. Vi adderar alltid och subtraherar aldrig. Och varje position är 10 mer än den föregående.
Vårt val av bas 10
Varför valde vi att multiplicera med 10 varje gång? Troligen för att vi har 10 fingrar.
En sak att inse är att du behöver tillräckligt många siffror för att ”fylla på” tills du når nästa tal. Låt mig demonstrera.
Om vi så att säga vill rulla över kilometerräknaren var tionde gång behöver vi symboler för siffrorna ett till nio; vi har inte nått tio än. Föreställ dig att siffrorna tickar långsamt uppåt – vid vilken tidpunkt vänder du på nästa enhet och börjar från noll?
Inför noll
Och vad händer när vi når tio? Hur visar vi att vi vill ha exakt en ”tio” och ingenting i kolumnen ”ettor”?
Vi använder noll, talet som inte finns. Noll är ett ganska stort begrepp, det är en platshållare, ett tomrum, ett mellanslag och en hel del annat. Det räcker med att säga att noll är en av alla tiders stora uppfinningar.
Noll gör det möjligt för oss att ha en tom platshållare, något som romarna inte hade. Se hur otympliga deras siffror är utan det.
George Orwells berömda roman ”1984″ skulle vara ”MCMLXXXIV”! Det går direkt på tungan, eller hur?
Med tanke på andra baser
Håll dig i minnet att vi valde att rulla om vår kilometerräknare var tionde. Vår räkning ser ut så här:
123456789 (uh oh, I'm getting full!)10 (ticked over – start a new digit)
Vad händer om vi tickar över vid 60 när vi räknar, som vi gör för sekunder och minuter?
1 second2345…58591:00 (60 seconds aka 1 minute. We've started a new digit.)
Allt är väl okej så här långt? Observera att vi använder kolon (:) för att ange att vi befinner oss vid en ny ”siffra”. I bas 10 kan varje siffra stå för sig själv.
Prova bas 16
Om vi vill ha bas 16 kan vi göra något liknande:
123456789101112131415 (we're getting full)1:00 (16 – we've started a new digit)
Vi vill dock inte skriva hexadecimala tal med kolon-notationen (även om vi skulle kunna göra det). Vi vill hellre koka ihop separata symboler för 10-15 så att vi bara kan skriva siffror som vi är vana vid. Vi har fått slut på siffror (1-9 har redan använts, med 0 som platshållare) så vi behöver några andra symboler. Vi skulle kunna använda några snirkliga linjer eller andra former, men det är vanligast att vi använder bokstäver i romersk stil. Precis som 5 blev V använder programmerare bokstäverna A-F för att få tillräckligt många siffror upp till 16. Det vill säga
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 använda en siffra per ”plats”, och vi vet att 10 faktiskt betyder att vi har ”tickat över till 16″ en gång.
20 betyder att vi har tickat över till 16 två gånger (32).
25 betyder att vi har tickat över till 16 två gånger (vilket ger oss 32) och gått en extra 5. Summan är 32 + 5 = 37.
Snabb genomgång
Har du varit med så här långt? Det här är ganska häftigt, eller hur? Vi kan räkna i vilket system som helst. Lägg också märke till att bas 16 är mer ”utrymmesbesparande” i den meningen att vi kan skriva ett tal som 11 med en enda siffra: B.
Bas 16 skiljer sig egentligen inte så mycket från bas 10, vi tar bara längre tid på oss att fylla på.
Den underbara binära världen
Vi har sett massor av bassystem, från det överdrivet enkla unära systemet, till de otryggt romerska siffrorna, den stabila basen 10 och den kompakta basen 16.
Vad är det som är så bra med binär? I en anda av att hålla saker och ting enkla är det det enklaste talsystem som har begreppet ”tickande”. Unary, där vi bara skriver 1, 11, 111… fortsätter i all oändlighet. Binärt, med två alternativ (1 och 0) ser ut så här:
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)…
och så vidare.
Då binärt är så enkelt är det mycket lätt att bygga in i hårdvara. Du behöver bara saker som kan slås på eller stängas av (för att representera 1 och 0), snarare än saker som har 10 möjliga tillstånd (för att representera decimaltal).
Då det är så enkelt är binärt också motståndskraftigt mot fel. Om din signal är ”delvis på” (låt oss säga 0,4) kan du anta att det är en nolla. Och om den är mestadels på (låt oss säga 0,8) kan du anta att det är en 1. Om du använder ett system med 10 möjliga tillstånd är det svårt att avgöra när ett fel har uppstått. Detta är en av anledningarna till att digitala signaler är så motståndskraftiga mot brus.
Andra exempel på baser
Vi använder andra baser hela tiden, även dynamiskt förändrade baser. Vi tänker vanligtvis inte på det på det sättet:
Stunder, minuter, sekunder: 1:32:04
- Vi vet att detta är 1 timme, 32 minuter och 4 sekunder. I sekunder är detta 16060 + 32*60 + 4.
Fot och tum: 3′ 5″
- Detta är 3 fot, 5 tum eller 3 * 12 + 5 tum.
Pund och uns: 8 lbs, 5 oz
- Då ett pund är 16 oz är detta 8 * 16 + 5 oz. Vi har använt ett talsystem med basen 16 hela tiden!
Tillfälliga tankar
”10″ i ett talsystem anger basen och betyder att vi har gått över en gång. 10 i binär betyder två, 10 i decimal betyder tio och 10 i hexadecimal betyder sexton.
Hur håller man dessa tal isär? Programmerare skriver ofta ”0b” framför binära tal. Så 2 i binär är
0b10
På samma sätt skriver de 0x framför hexadecimala tal. Så 16 i hexagram är:
0×10
Om det inte finns några symboler (0b eller 0x) framför antar vi att det är bas 10, ett vanligt tal.
Gå nu ut och njut av dina nya kunskaper!
Andra inlägg i den här serien
- Talsystem och baser
- Snabbguide till GUIDs
- Förstå Quake’s snabba inversa kvadratrot
- En enkel introduktion till datorsystem. Networking
- Swap två variabler med hjälp av XOR
- Förståelse av Big och Little Endian Byte Order
- Unicode and You
- En liten grej om binära filformat
- Sorteringsalgoritmer