Bitar, bytes och sånt

Datorer arbetar normalt med tal uttryckta i basen två och man talar därför om binära tal. En bit är en binär siffra (BInary Digit) dvs. ett av talen noll eller ett. Det binära talsystemet är ett positionssystem precis som vårt decimala system, som ju har basen tio. En siffras vikt (betydelse) avgörs således av dess position i talet. Om vi betraktar det decimala talet 347.2 så kan det ju skrivas 3 × 102 + 4 × 101 + 7 × 100 + 2 × 10-1, så att vikten för en siffra i position p (om entalssiffran har position noll, tiotalssiffran position ett etc.) är 10p.

Om allmänt basen är ß har vi ß olika siffror, 0, 1, ..., ß-1. En siffras vikt är ßp där p är siffrans position. Låt oss använda detta för att uttrycka det binära talet 1101.101 i decimal form. Vi skriver normalt (1101.101)2 för att betona att talet är givet i basen två, 1101.101 tolkat i basen tio är ju ett helt annat tal.

(1101.101)2 = 1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 + 1 × 2-1 + 0 × 2-2 + 1 × 2-3 = 13.625

Skilj mellan siffror som är talen 0, 1, ..., ß-1 och tal som är sammansättningar av siffror. Siffror är tal, men tal är inte alltid siffror. Det decimala talet 145.77 är ingen siffra.

Åtta bitar bildar en byte och fyra bitar bildar en nibble. Ofta har man många bytes och man använder då prefix som i fysik och andra naturvetenskaper. I fysik står kilo för 1000, som i 1 kg (ett kilogram), 1 km (en kilometer) etc. Mega står för 106, 1 MW (en megawatt). Dessa prefix har dock en liten annan betydelse i datorsammanhang. kilo är då 210 = 1024, mega = 220 = 1048576, etc. Notera att 1024 är ungefär 1000 så att om vi vill göra överslagsberäkningar kan vi tänka i de vanliga tiopotenserna. En Mbyte är till exempel 220 bytes som är ungefär 106 bytes.

Stora binära tal tar stor plats att skriva ut. Ett tal på binär form kräver ungefär 3.3 så många siffror som talet skrivet i decimal form (eftersom log2 10m = m log2 10 = m 3.3219...). För att inte behöva skriva så mycket brukar man, i datorsammanhang, använda två andra talsystem, det oktala med basen åtta och det hexadecimala med basen sexton. Det är enkelt att konvertera mellan dessa olika talsystem (eftersom baserna är tvåpotenser). I det oktala talsystemet har vi siffrorna noll till och med sju och när vi använder det hexadecimala talsystemet får vi hitta på sex nya siffror. Normalt använder man bokstäverna a - f för de nya siffrorna. här följer en liten tabell som visar sambandet mellan de hexadecimala siffrorna och några andra talsystem:

Hexadecimal siffra

Decimalt

Binärt

Oktalt

0

0

0000

0

1

1

0001

1

2

2

0010

2

3

3

0011

3

4

4

0100

4

5

5

0101

5

6

6

0110

6

7

7

0111

7

8

8

1000

10

9

9

1001

11

a

10

1010

12

b

11

1011

13

c

12

1100

14

d

13

1101

15

e

14

1110

16

f

15

1111

17

Siffrorna, a-f, skrivs i bland med versaler.

Här följer ett exempel: 2bf.8 hexadecimalt är lika med 2 × 162 + 11 × 161 + 15 × 160 + 8 × 16-1 = 703.5 decimalt.

Det är enkelt att konvertera mellan det hexadecimala systemet och det binära. Låt oss konvertera talet ovan till det binära systemet. Vi ersätter då varje hexadecimal siffra med motsvarande binära tal (enligt tabellen ovan) och får 0010 1011 1111.1000 (där jag har skrivit ut fyra bitar för varje hexadecimal siffra) eller med onödiga nollor avlägsnade 1010111111.1. Låt oss nu anta att vi har ett tal på binär form och måste skriva det på hexadecimal form. Vi grupperar då bitarna fyra och fyra (till vänster respektive till höger om decimalpunkten), dvs. 0010 1011 1111.1000 i exemplet, därefter ersätter vi grupperna med motsvarande hexadecimala siffror och får 2bf.8. Det fungerar analogt att gå mellan det oktala- och det binära talsystemet fastän man får använda grupper om tre bitar. Så 1010111111.1 blir oktalt  1277.4 (grupperingen blir 1 010 111 111.100).

Teckenkoder

Även tecken (bokstäver, skiljetecken, tecknen 0-9 etc.) lagras med bitar (teckenkoder). Det finns flera standarder och den standard vi använder , ISO 8859-1, utnyttjar en byte för varje tecken. Detta ger upphov till 28 = 256 olika kombinationer (binära tal) vilket räcker för många teckenuppsättningar, men inte för kinesiska t.ex. där man får använda fyra bytes (216 = 65536 kombinationer). Här följer en tabell över några teckenkoder

Tecken Teckenkod (hexadecimalt)

a

61

b

62

A

41

B

42

mellanslag

20

. (punkt)

2e

1

31

Notera att det är skillnad på talet ett och en textsträng som innehåller tecknet ett.

Låt oss se på ett exempel. Antag att vi vill lagra en pocketbok (utan illustrationer) som en fil. Låt oss anta att boken består av 220 sidor, där varje sida innehåller 40 rader och en typisk rad har 60 tecken (bokstäver, skiljetecken). Antalet tecken per rad varierar, bland annat därför att böcker typsätts med ett proportionellt typsnitt (olika tecken upptar olika bredd på sidan; bokstaven m tar mer plats än bokstaven l till exempel). Det tar alltså ungefär 220 × 40 × 60 = 528 000 tecken dvs. ungefär 0.5 Mbyte.

En vanlig CD-skiva kan lagra ungefär 650 Mbyte, ungefär 1290 böcker. En vanlig hårddisk kanske rymmer 50 Gbyte, mer än 100 000 böcker.

Det som tar plats när det gäller media är bilder, video och ljud. Text tar inte så mycket plats.


Några övningar

I övningarna är ß ett heltal större än ett. Jag kommer att tala om decimaler och decimalpunkt fastän "decimal" har med "tionde" att göra. Jag känner inte till någon vedertagen term för "binära decimaler" (kanske binaler, binärer eller binäler). Binärpunkt används i bland i ställer för decimalpunkt. Om Du vill lära Dig mycket om talsystem, se kapitel 4 i klassikern av Donald E. Knuth: The Art of Computer Programming, Volume 2,  Seminumerical Algorithms. Han tar bland mycket annat upp ett talsystem, "balanced ternary", med basen tre och siffrorna -1, 0 och 1 (en generalisering av vår definition). Så om vi låter 1 beteckna -1 så svarar 101 då mot 8 decimalt.1110.11 blir 32.555... (32 + 5/9) decimalt. Även Knuth kommenterar de olika talsystemens namn.

 

  1. Uttryck 111.1 som ett decimalt tal när det tolkas som ett binärt tal, som ett oktalt tal respektive som ett hexadecimalt tal.
     
  2. Givet ett talsystem med basen ß så finns det ingen siffra (i det aktuella talsystemet) som betecknar basen. Visa att basen dock alltid kan skrivas 10 i det aktuella talsystemet. Det är alltså ingen slump att det decimala talet tio skrivs 10 i det decimala talsystemet.
     
  3. Det är enkelt att multiplicera och dividera ett tal med basen. Antag att  talet t = ssss.dddd är givet i talsystemet med basen ß. s markerar olika siffror till vänster om decimalpunkten och d står för olika siffror till höger om decimalpunkten. Då gäller att ß × t = ssssd.ddd och t / ß = sss.sdddd. Visa detta!
     
  4. Låt talet t vara givet i det decimala talsystemet med t = 0.9999....,  en oändlig följd av nior. Om vi tolkar t som summan av en serie blir t lika med ett. Visa att det är sant i varje bas, dvs. låt s = ß - 1 (dvs. den största siffran i talsystemet). Visa att i talsystemet med basen ß så gäller att 0.sssss... = 1.
     
  5. Svårare: Visa att 0.1 decimalt inte har en ändlig decimalutveckling om talet skrivs på binär form. Detta är inget konstigt. En tredjedel (decimalt) har ju en oändlig decimalutveckling decimalt (1 / 3 = 0.333...) men det kan skrivas 0.1 i basen tre eller 0.2 i basen 6 t.ex.
     
  6. För att haka på föregående övning. Det är kanske lite lustigt att 1 / 3 = 0.3333..... Finns det alltid en siffra, s,  i ett talsystem så att 1 / s = 0.ssss...? I talsystemet med ß = 5 gäller t.ex. 1 / 2 = 0.2222... För vilka baser gäller detta?


Svar på 1: 7.5, 73.125 respektive 273.0625. Del av 5: 0.1 = (0.000110011001100110011...)2. Svar på 6: när s2 = ß - 1.


Back