Åtta bitar utgör en byte. En bit är den lägsta beståndsdelen i en dator. En bit är en etta eller nolla, strömmen på eller av. Lägre beståndsdel än så kan vi inte hitta i datorn. Ett tecken i datorn är en byte stor (om vi bortser från UTF-8 som är större än en byte för att få plats med specialtecken och svenska tecken exempelvis). En byte kan maximalt representera talet 255. Det är här det binära talsystemet kommer in i bilden. Om vi tittar på nedanstående bilder så brukar saker och ting falla på plats när det gäller bitar och det binära talsystemet. I bilden direkt nedanför är samtliga bitar (åtta styck) satta till ett. Att alla bitarna är satta till ett innebär att vi adderar ihop alla talen i den nedersta rutan. Vi adderar alltså enbart talen som är “satta”, det vill säga rutorna som har en etta ovanför sig. 111111 binärt är alltså 255 i vårt decimala talsystem.

255 binärt

I nästa bild är några bitar “satta”, det vill säga en etta, och några bitar som inte är satta, det vill säga de har en nolla i rutan istället. I just det här fallet med bilden nedan får vi det binära talet 00101011 som decimalt blir 43.

255 binärt

Omvandla från binärt till decimalt

Det enklaste sättet för att omvandla binärt till decimalt är att göra uppställningarna enligt ovan. Man skriver alltså upp det binära talet och under varje siffra skriver vi, med början från höger, 1 2 4 8 16 32 och vidare. Sedan adderar vi bara ihop de tal där vi har en etta. Men varifrån kommer talen 1 2 4 8 16 och 32 ifrån då?

Jo, eftersom det binära talsystemet endast har två möjliga tecken (1 och 0) så säger vi att talsystemet har basen 2. Det är här dessa siffror kommer ifrån, eftersom $2^0 = 1$, $2^1 = 2$, $2^2 = 4$, $2^3 = 8$, $2^4 = 16$, $2^5 = 32$, $2^6 = 64$, $2^7 = 128$ och så vidare. I och med detta kan vi också omvandla från binärt till decimalt på ett annat sätt om vi inte vill skriva ut hela omvandlingen som vi gjorde ovan. Låt oss anta att vi har det binära talet 101100. För att omvandla detta kan vi göra uträkningen enligt nedastående steg. Vi börjar bakifrån som alltid.

Nu adderar vi resultaten och får $4+8+32=44$. Detta sättet kanske är ännu enklare för någon? Det är en smaksak vilket sätt man vill använda, båda bygger dock på samma princip. När vi använder denna metod för att omvanlda behöver vi inte hålla koll på 1, 2, 4, 8 och så vidare, vi ökar bara exponenten med ett för varje siffra.

Omvandla från decimalt till binärt

Att göra tvärtom, omvandla decimalt till binärt är inte mycket svårare. Här dividerar vi bara talet med två, noterar resten (1 eller 0), dividerar svaret vi får med två igen, noterar resten igen och så vidare. Om vi tar och testar att omvandla talet 17 till binärt så får vi alltså följande uppställning.

17 till binärt

Steg för steg blir uträkningen följande.

Svaret blir alltså nu, med början nedifrån, samtliga rester i uträkningarna, 10001. Första siffran i svaret är alltså sista siffran i uträkningen.

Hexadecimala talsystemet

Det hexadecimala talsystemet har 16 som bas, det vill säga det finns totalt 16 olika tecken i talsystemet. Men innan vi går igenom hur man räknar ut hexadecimala värden ska vi reda ut varför det det hexadecimala talsystemet är så frekvent återkommande i datorsammanhang.

Det är nämligen så att det hexadecimala talsystemet gör det enklare att uttrycka större binära tal. Det är faktiskt också mycket enklare att omvandla mellan binärt och hexadecimalt, än vad det är mellan binärt och decimalt. Denna enkelheten kommer ifrån att en grupp om fyra binära tecken är det maximala värdet vi kan uttrycka med ett enda hexadecimalt tecken. För att inte ta miste mellan decimala och hexadecimala tal använder man prefixet 0x framför hexadecimala tal. Det hexadecimala talet 55 skrivs alltså 0x55 för att inte mistas mot det decimala talet 55, som inte är samma värde.

16 möjliga tecken

Det hexadecimala talsystemet har 16 möjliga tecken, alltså 6 fler än i vårt vanliga decimala talsystem. De “extra” tecknen är A-F.

Hexadecimalt Decimalt
0x0 0
0x1 1
0x2 2
0x3 3
0x4 4
0x5 5
0x6 6
0x7 7
0x8 8
0x9 9
0xA 10
0xB 11
0xC 12
0xD 13
0xE 14
0xF 15

Omvandla mellan hexadecimalt och binärt

Att omvandla hexadecimala tal till och från binärt är mycket enkelt. Precis som vi redan har nämnt så handlar det helt enkelt bara om att gruppera de binära talen i grupper om fyra. Detta fungerar åt båda hållen, alltså både när vi ska konvertera till och från binärt.

Vi börjar med några enkla exempel. Vi vet redan att A = 10, B = 11, C = 12, D = 13, E = 14 och F = 15.

Vi börjar med att konvertera 0x2D till binärt.

Grupp 1 Grupp 2
2 D
10 1101

0x2D blir alltså 101101 binärt. Vi tar ett lite större tal som nästa exempel, nämligen 0x3CE.

Grupp 1 Grupp 2 Grupp 3
3 C E
11 1100 1110

0x3CE i binärt blir alltså 1111001110.

Det är dags att testa att göra tvärtom, omvandla från binärt till hexadecimalt. Detta är precis lika enkelt. Här delar vi bara upp det binära talet i grupper om fyra. Vi börjar med det binära talet 1011101110. Talet innehåller sammanlagt tio siffror, därför börjar vi med att sätta de två första talen för sig själv (10, längst till vänster), sedan delar vi på resten så vi får två grupper om fyra i varje.

Grupp 1 Grupp 2 Grupp 3
10 1110 1110
2 E E

1011101110 binärt blir alltså 0x2EE hexadecimalt.

Vi tar ett ännu större binärt tal nu, 1110011011101110110101011. I detta talet har vi 25 tecken. Vi börjar alltså då som vanligt med den första ettan längst till vänster.

Grupp 1 Grupp 2 Grupp 3 Grupp 4 Grupp 5 Grupp 6 Grupp 7
1 1100 1101 1101 1101 1010 1011
1 C D D D A B

Lägger vi nu ihop alla de hexadecimala tecken så får vi svaret: 0x1CDDDAB.

Det är just detta som är det fina med det hexadecimala talsystemet, att på ett enkelt sätt och med väldigt få tecken kunna representera stora binära tal.

Omvandla hexadecimala tal till decimala tal

Precis som i vårt vanliga talsystem är positionerna på siffrorna viktiga, exempelvis ental, tiotal, hundratal, tusental och så vidare. Detta bygger på att det decimala talsystemet har 10 som bas, och således har vi 1, 10, 100, 1000 och så vidare. I det hexadecimala talsystemet är istället basen 16, vilket gör att vi istället har ental ($16^0$), sextons ($16^1$), 256:or ($16^2$), 4096:or ($16^3$) och så vidare.

Talet 0x10 blir då 16. Ettan i 0x10 representerar en styck 16 (“sextons”). Nollan efteråt indikerar vi inte ska lägga till några ental. Talet 0x12 blir då 18. Återigen representerar ettan en styck 16. Därefter adderar vi två och får 18.

Talet 0x2C är 44 decimalt. Detta får vi genom att vi nu har två styck 16, alltså $2\times16$ vilket blir 32. Därefter adderar vi C (vilket är 12) till 32, vilket blir 44.

Tabellen nedanför visar de decimala talen mellan 1 och 48 i det hexadecimala talsystemet och hur de räknas fram enligt principen vi precis gått igenom. Notera också att vid varje F har vi en “full grupp” med ettor i det binära talsystemet. Och varje gång vi har en nytt 16:s tal ($1\times16$), ($2\times16$) får vi också ett binärt tal som med ledande ettor och resten nollor. Det finns många mönster att upptäckta i tabellen här nedan, allting hänger ihop.

Hexadecimalt Uträkning till dec Decimalt Binärt
0x1 $1$ 1 1
0x2 $2$ 2 10
0x3 $3$ 3 11
0x4 $4$ 4 100
0x5 $5$ 5 101
0x6 $6$ 6 110
0x7 $7$ 7 111
0x8 $8$ 8 1000
0x9 $9$ 9 1001
0xA $9+1$ 10 1010
0xB $9+2$ 11 1011
0xC $9+3$ 12 1100
0xD $9+4$ 13 1101
0xE $9+5$ 14 1110
0xF $9+6$ 15 1111
0x10 $(1\times16^1)+0$ 16 10000
0x11 $(1\times16^1)+1$ 17 10001
0x12 $(1\times16^1)+2$ 18 10010
0x13 $(1\times16^1)+3$ 19 10011
0x14 $(1\times16^1)+4$ 20 10100
0x15 $(1\times16^1)+5$ 21 10101
0x16 $(1\times16^1)+6$ 22 10110
0x17 $(1\times16^1)+7$ 23 10111
0x18 $(1\times16^1)+8$ 24 11000
0x19 $(1\times16^1)+9$ 25 11001
0x1A $(1\times16^1)+10$ 26 11010
0x1B $(1\times16^1)+11$ 27 11011
0x1C $(1\times16^1)+12$ 28 11100
0x1D $(1\times16^1)+13$ 29 11101
0x1E $(1\times16^1)+14$ 30 11110
0x1F $(1\times16^1)+15$ 31 11111
0x20 $(2\times16^)+0$ 32 100000
0x21 $(2\times16^1)+1$ 33 100001
0x22 $(2\times16^1)+2$ 34 100010
0x23 $(2\times16^1)+3$ 35 100011
0x24 $(2\times16^1)+4$ 36 100100
0x25 $(2\times16^1)+5$ 37 100101
0x26 $(2\times16^1)+6$ 38 100110
0x27 $(2\times16^1)+7$ 39 100111
0x28 $(2\times16^1)+8$ 40 101000
0x29 $(2\times16^1)+9$ 41 101001
0x2A $(2\times16^1)+10$ 42 101010
0x2B $(2\times16^1)+11$ 43 101011
0x2C $(2\times16^1)+12$ 44 101100
0x2D $(2\times16^1)+13$ 45 101101
0x2E $(2\times16^1)+14$ 46 101110
0x2F $(2\times16^)+15$ 47 101111
0x30 $(3\times16^1)+0$ 48 110000

I tabellen nedan visas några större hexadecimala tal som 0x10, 0x100, 0x200, 0xFFFF och så vidare som har stor betydelse i datorsammanhang. Här ser vi ytterligare mönster och får en känsla för hur allting hänger ihop.

Hexadecimalt Uträkning till dec Decimalt Binärt
0x40 $(4\times16^1)+0$ 64 1000000
0x80 $(8\times16^1)+0$ 128 10000000
0x100 $(1\times16^2)+0$ 256 100000000
0x200 $(2\times16^2)+0$ 512 1000000000
0x400 $(4\times16^2)+0$ 1024 10000000000
0x800 $(8\times16^2)+0$ 2048 100000000000
0x1000 $(1\times16^3)+0$ 4096 1000000000000
0x8000 $(8\times16^3)+0$ 32768 1000000000000000
0xFFFF Se nedan* 65535 1111111111111111
0x10000 $(1\times16^4)+0$ 65536 10000000000000000

* 0xFFFF till decimalt: $(15\times16^3)+(15\times16^2)+(15\times16^1)+(15\times16^0)$

Räkna ut större och mer komplicerade tal

Hur omvandlar vi då större och mer komplicerade hexadecimala tal till decimalt? Vi utgår från samma princip som ovan och adderar resultaten. Vi tar 0x5CE som exempel.

Vi börjar bakifrån med siffran E eftersom det då är enklare att hålla ordning på exponenten. Kom ihåg att E motsvarar 14 och C motsvarar 12.

Nu adderar vi ihop resultaten: $14+192+1280=1486$. Notera att detta var exakt samma princip vi använde när vi omvandlade binära tal till decimala tal, fast istället för basen 2 använde vi basen 16. Återigen, allting hänger ihop.