3

Jedničky a nuly

V minulém článku jsem si ukázali, že desítková soustava není jediný způsob, jak zapisovat počty lentilek nebo letopočty. Viděli jsme osmičkovou i šestnáctkovou soustavu a na konci jsme zmínili, že pro počítače se nejlépe hodí soustava dvojková. Pojďme se tedy společně podívat na to, proč tomu tak je, a co to doopravdy znamená, když se řekne, že počítače pracují s nulami a jedničkami.

Pozor na semafory

Všechny současné počítače jsou z podstaty elektronické. Veškeré výpočty a přesouvání dat se tedy děje pomocí elektrických signálů běžících různými komplikovanými obvody. Jak vypadají obvody uvnitř počítače si můžete prohlédnout v krátkém videjku, které ukazuje, procesor počítače pod elektronovým mikroskopem.

Pokud bychom chtěli uvnitř procesoru počítat desítkově, museli bychom v každém elektrickém vodiči rozlišovat deset úrovní napětí pro přenos jednotlivých cifer. Svět vodičů a polovodičů není ale tak úhledný, abychom dokázali vyrobit vždy dokonale přesnou hodnotu napětí. Vždycky musíme počítat s nějakým šumem, náhodnými výkyvy atd. Představte si například, že by dopravní semafory neměly tři oddělená světla, ale pouze jedno. To by navíc místo červené, oranžové a zelené svítilo pouze třemi různými odstíny modré. Tmavě modrá - stůj, normální modrá - připrav se, světle modrá - jeď. Po takové změně by si člověk asi dobře rozmyslel, jestli vůbec sedne za volant. A to jsme zavedli možnosti pouze tři a nikoliv všech deset.

Nejbezpečnější semafor s jediním světlem by asi byl takový, který by přepínal pouze mezi dvěma možnostmi, a ty by byly barevně co nejdál od sebe. Stejně to funguje i uvnitř počítačů. Elektronika plošných spojů je nejjednodušší tehdy, když máme pouze dvě možnosti. Buď proud teče nebo neteče, vypnuto nebo zapnuto. Počet cifer v naší soustavě se nám tady vyplatí snížit až na pouhé dvě. Naše početní soustava tak bude dvojková, nebo-li binární.

Dvojková soustava

Z osmičkové soustavy už jsme zvyklí na to, že cifer může být méně než deset. Počítali jsme 0, 1, 2, 3, 4, 5, 6, 7 a cifry nám došly, tak jsme museli začít skládat dvojice. Osm pak bylo 10, devět bylo 11 a tak dále. Přesně totéž provedeme i ve dvojkové soustavě, jen nám cifry dojdou mnohem dřív. Počítáme 0, 1 a najednou je konec. Musíme začít skládat. Dvojka pak je 10, trojka je 11. A zase jsme na konci, musíme přidat cifru. Čtyri je proto 100, pět je 101, šest je 110 a sedm je 111. Pokud bychom počítali lentilky, dopadneme takto.

Lentilky dvojkově

Podobně, jako jsme v Pythonu používali předpony 0o pro osmičkovou a 0x pro šestnáckovou soustavu, pro dvojkovou máme předponu 0b. Můžeme tak psát

>>> 0b10001110
142

Můžeme také použít funkci bin pro převod opačným směrem.

>>> bin(142)
'0b10001110'

Bity a bajty

Nyní přichází ta vytoužená chvíle, kvůli které jsme tak dlouze zkoumali taje číselných soustav. Ukážeme si, jak funguje pamět počítače a jak se do ní ukládají různé druhy dat. K tomu budeme potřebovat několik základních termínů. Jedné dvojkové cifře se odborně říká bit. Jeden bit tedy může představovat nulu nebo jedničku. My bychom pamět počítače členit do trochu větších kousků, kterým budeme říkat bajty (anglicky byte). Každý bajt se skládá z osmi bitů. Proč zrovna z osmi si vysvětlíme pozdějí, až se budeme bavit o tom, jak počítače pracují s textem. Do jedné paměťové buňky se tak vždy vejde přesně osm bitů, tedy nejvýš osmiciferné binární číslo.

Kdybychom si tedy vyřízli nějaký menší úsek paměti počítače, mohl by vypadat například takto.

00:01011010
01:01110110
02:01101100
03:11000011
04:10100001
05:11000101
06:10100001
07:11000101
08:10100101
09:00100000
10:01111010
11:11000011
12:10100001
13:01101011
14:01100101
15:11000101
16:10011001
17:01101110
18:11000011
19:10111101
20:00100000
21:01110101
22:11000100
23:10001101
24:01100101
25:11000101
26:10001000
27:00100000
28:01110011
29:00100000
30:11000100
31:10001111
32:01101111
33:01101100
34:11000011
35:10101101
36:11000100
37:10001101
38:01101011
39:01111001
40:00100000
41:01100010
42:11000100
43:10011011
44:11000101
45:10111110
46:11000011
47:10101101
48:00100000
49:01110000
50:01101111
51:01100100
52:11000011
53:10101001
54:01101100
55:00100000
56:01111010
57:11000011
58:10110011
59:01101110
60:01111001
61:00100000
62:11000011
63:10111010
64:01101100
65:11000101
66:10101111
67:00101110

Na tomto výpisu vidíme 68 bajtů. Před každým bajtem máme číslo udávající jeho pozici v paměti. Všimněte si, že opět jako správní ajťáci počítáme od nuly. Co tento kus paměti obsahuje si zatím necháme jako malé tajemství, které budeme postupně spolu odkrývat. Zatím si můžeme vyzkoušet, že první bajt na adrese 00 obsahuje číslo 90

>>> 0b01011010
90

Takto bycho mohli zjistit číslo uložené v každém jednotlivém bajtu. Vypisovat ale kus paměti takhle bit po bitu je hodně nepraktické, protože to zabírá hodně místa. Zde nám právě přijde vhod šestnáctková (hexadecimální) soustava. Všimněte si, že největší číslo, které lze do jednoho bajtu uložit, je 0b11111111, tedy desítkově 255. To je zrovna "náhodou" nejvyšší dvojciferné hexadecimální číslo 0xff. Každý bajt se tedy dá zapsat dvěma hexadecimálními ciframi. Výše uvedený kousek paměti tak můžeme hexadecimálně zapsat zapsat takto

00: 5A 76 6C C3 A1 C5 A1 C5 A5 20 7A C3 A1 6B 65 C5
16: 99 6E C3 BD 20 75 C4 8D 65 C5 88 20 73 20 C4 8F
32: 6F 6C C3 AD C4 8D 6B 79 20 62 C4 9B C5 BE C3 AD
48: 20 70 6F 64 C3 A9 6C 20 7A C3 B3 6E 79 20 C3 BA
64: 6C C5 AF 2E

V tomto zápisu se nám vejde 16 bajtů na řádek. Na začátku každého řádku máme pozici v paměti, na které řádek začíná. Jelikož jsou všechny bajty zapsány šestnáckově, bývá zvykem i jejich pozice zapisovat šestnáctkově. Pro lepší orientaci si také doplníme pozice bajtů v každém řádku (také šestnáctkově). Výpis tedy nakonec bude vypadat takto

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00: 5A 76 6C C3 A1 C5 A1 C5 A5 20 7A C3 A1 6B 65 C5
10: 99 6E C3 BD 20 75 C4 8D 65 C5 88 20 73 20 C4 8F
20: 6F 6C C3 AD C4 8D 6B 79 20 62 C4 9B C5 BE C3 AD
30: 20 70 6F 64 C3 A9 6C 20 7A C3 B3 6E 79 20 C3 BA
40: 6C C5 AF 2E

Zápis jako nahoře je běžný způsob, jak si zobrazit obsah nějakého souboru na disku nebo nějakého kusu pamtěti, abyste přesně viděli jeho obsah.

Kilobajty, megabajty, gigabajty

Náš kousek binárních dat je v porovnání s běžnými objemy naprosto titěrný. Až v příštím článku odhalíme, co je v této změti nul a jedniček zakódováno, zjistíme že do prostoru 68 bajtů se toho opravdu moc nevejde. K měření objemu dat tak používáme mnohem větší jednotky:

  • kilobajt (kB) je 1000 bajtů,
  • megabajt (MB) je 1000 kilobajtů,
  • gigabajt (GB) je 1000 megabajtů,
  • terabajt (TB) je 1000 terabajtů.

Pro představu si uveďme několik příkladů. Velikost operační paměti (RAM) ve vašem počítači se dnes pohybuje v jednotkách GB. Pevné disky mívají kapacitu v jednotkách terabajtů, tedy bilionů bajtů. Velké společnosti jako například YouTube spravují datové sklady o velikostech milionů terabajtů.