Desítková soustava

Desítkovou poziční soustavu používáme pro běžné počítání. Desítková soustava pro zápis čísla používá deset symbolů: \(0,1,2,3,4,5,6,7,8,9\).

Číslo \(5864\) čteme: 5 tisíců + 8 stovek + 6 desítek + 4 jednotky, což můžeme napsat jako \(5864=5\cdot 1000 + 8\cdot 100 + 6\cdot10 + 4\cdot 1 = 5\cdot10^3+8\cdot 10^2+6\cdot 10^1+4\cdot 10^0\).

Abychom mohli provádět výpočty, musíme zavést v naší soustavě minimálně dvě operace: sčítání a násobení.

Operaci sčítání nebo součet definujeme tabulkou, musíme explicitně vyjmenovat, jaký výsledek dostaneme, pokud chceme sečíst 2 čísla. Součet se nachází na průsečíku příslušného řádku a sloupce tabulky.

Tabulka 1. Definice součtu
a+b 0 1 2 3 4 5 6 7 8 9

0

0

1

2

3

4

5

6

7

8

9

1

1

2

3

4

5

6

7

8

9

10

2

2

3

4

5

6

7

8

9

10

11

3

3

4

5

6

7

8

9

10

11

12

4

4

5

6

7

8

9

10

11

12

13

5

5

6

7

8

9

10

11

12

13

14

6

6

7

8

9

10

11

12

13

14

15

7

7

8

9

10

11

12

13

14

15

16

8

8

9

10

11

12

13

14

15

16

17

9

9

10

11

12

13

14

15

16

17

18

Pokud chceme sečíst dvě čísla, podíváme se do 1. sloupce a 1. rádku, najdeme příslušné číslice a na průsečíku máme výsledek sčítání.

Operaci násobení (což si můžeme představit jako "opakované sčítání") opět definujeme tabulkou:

Tabulka 2. Definice součinu
\(a\cdot b\) 0 1 2 3 4 5 6 7 8 9

0

0

0

0

0

0

0

0

0

0

0

1

0

1

2

3

4

5

6

7

8

9

2

0

2

4

6

8

10

12

14

16

18

3

0

3

6

9

12

15

18

21

24

27

4

0

4

8

12

16

20

24

28

32

36

5

0

5

10

15

20

25

30

35

40

45

6

0

6

12

18

24

30

36

42

48

54

7

0

7

14

21

28

35

42

49

56

63

8

0

8

16

24

32

40

48

56

64

72

9

0

9

18

27

36

45

54

63

72

81

Operaci odčítání zadefinujeme jako součet jedno čísla a pro druhé číslo použijeme číslo opačné.

Operaci dělení zadefinujeme jako součin jednoho čísla s druhým číslem inverzním.

A je to. Můžeme směle počítat.

Libovolné přirozené číslo v naší poziční soustavě můžeme vyjádřit jako součet:

\(c_{n}\cdot 10^n+c_{n-1}\cdot 10^{n-1}+\dots + c_{2}\cdot 10^2 + c_1\cdot 10^1+c_0\cdot 10^0\), kde \(c\) je číslice na příslušné pozici (v příslušném řádu) vynásobená mocninou 10 na ten samý řád.

Matematické vyjádření desítkové soustavy

\[x = \sum_{i=0}^{k-1} x_i \cdot 10^i\]

kde \(x =\) číslo; \(k =\) počet číslic (pozic); \(x_i = \{0, 1, 2, 3, 4, 5, 6, 7, 8, 9\}\); \(10=\) základ soustavy.

Počítače bohužel naší desítkové soustavě nerozumí, protože používají číselnou soustavu jednodušší, dvojkovou.

Dvojková (binární) soustava

Dvojková soustava používá pouze dva symboly \(\mathbf{0,1}\) a místo mocnin desítky se používají mocniny dvojky.

Algoritmy pro sčítání a násobení čísel jsou stejné, jako v desítkové soustavě.

Tabulka 3. Definice sčítání
\(a+b\) 0 1

0

0

1

1

1

10 (toto není deset, ale jedna a nula)

Stějně tak jde definovat sčítání pomocí čtyř rovností:

\[\begin{aligned} 0+0=\;\; 0 &\\ 0+1=\;\; 1 &\\ 1+0=\;\; 1 &\\ 1+1=10 &\\ \end{aligned}\]

Příklady: \(1+1=10\)

\(1+1+1=10+1=11\)

\(1+1+1+1=10+1+1=11+1=100\)

\(1+1+1+1+1=101\)

Příklady sčítání (pod sebou):

\[\begin{aligned} 1001 & \\ + 101 & \\ \hline = 1110 & \\ \end{aligned}\]
\[\begin{aligned} 1111 & \\ + 111 & \\ \hline = 10110 & \\ \end{aligned}\]
\[\begin{aligned} 10111011& \\ + 11001100& \\ \hline = 110000111& \end{aligned}\]
Tabulka 4. Definice násobení
\(a\cdot b\) 0 1

0

0

0

1

0

1

"Malá násobilka" ve dvojkové soustavě

\[\begin{aligned} 0\cdot 0&=0 \\ 0\cdot 1&=0 \\ 1\cdot 0&=0 \\ 1\cdot 1&=1 \\ \end{aligned}\]

Příklad násobení (pod sebou)

\[\begin{aligned} 101& \\ \cdot 10&\\ \hline 000& \\ +101\;\: &\\ \hline =1010 &\\ \end{aligned}\]

Příklad násobení (řádky se samými 0 jsou vynechány):

\[\begin{aligned} 10111011& \\ \cdot 11001100& \\ \hline + 10111011\color{blue}{00}& \\ + 10111011\color{blue}{000}& \\ + 10111011\color{blue}{000000}& \\ + 10111011\color{blue}{0000000}& \\ \hline 1000111000100& \\ + 100011000100000& \\ \hline = 100101010000100& \\ \end{aligned}\]

Je docela šílenství násobit ve dvojkové soustavě ručně, a proto je lepší a jednodušší použít kalkulačku, přepnutou do programátorského módu.

prog kalkulacka

Matematické vyjádření dvojkové soustavy

\[x = \sum_{i=0}^{k-1} x_i \cdot 2^i\]

kde \(x =\) číslo; \(k =\) počet číslic (pozic); \(x_i = \{0, 1\}\); \(2=\) základ soustavy.

Převod čísla z binární (dvojkové) do desítkové soustavy

Tabulka 5. Tabulka mocnin dvojky
řád 10 9 8 7 6 5 4 3 2 1 0

mocnina

\(2^{10}\)

\(2^9\)

\(2^8\)

\(2^7\)

\(2^6\)

\(2^5\)

\(2^4\)

\(2^3\)

\(2^2\)

\(2^1\)

\(2^0\)

výsledek (dekadicky)

\(1024_{10}\)

\(512_{10}\)

\(256_{10}\)

\(128_{10}\)

\(64_{10}\)

\(32_{10}\)

\(16_{10}\)

\(8_{10}\)

\(4_{10}\)

\(2_{10}\)

1

Převod z binární do desítkové soustavy je poměrně jednoduchý, zapíšeme číslo jako součet příslušných mocnin dvojky.

\(11011_2 = 1\cdot 2^4+1\cdot 2^3+0\cdot 1^2+1\cdot 2^1+1\cdot 2^0=16+8+0+2+1=27_{10}\)

Pokud mícháme dohromady několik pozičních číselných soustav o různé mocnině, je velmi dobré to vyjádřit.

Toto je číslo ve dvojkové soustavě \(11011_{2}\) (čte se jedna, jedna, nula, jedna, jedna).

Toto je číslo v desítkové soustavě \(11011_{10}\) (čte se jedenáct tisíc jedenáct).

Pokud bychom obě čísla převedli do stejné soustavy, tak bude vidět, že čísla \(11011_2 \ne 11011_{10}\), protože číslo \(11011_2=27_{10}\).

Pokud je číslo dlouhé, je vhodné použít pro převod z binární do desítkové soustavy tabulku.

Příklad: převeďte číslo \(1101101000_2\) do desítkové soustavy

Tabulka 6. Tabulka mocnin dvojky
řád 10 9 8 7 6 5 4 3 2 1 0

mocnina

\(2^{10}\)

\(2^9\)

\(2^8\)

\(2^7\)

\(2^6\)

\(2^5\)

\(2^4\)

\(2^3\)

\(2^2\)

\(2^1\)

\(2^0\)

mocnina (dekadicky)

\(1024_{10}\)

\(512_{10}\)

\(256_{10}\)

\(128_{10}\)

\(64_{10}\)

\(32_{10}\)

\(16_{10}\)

\(8_{10}\)

\(4_{10}\)

\(2_{10}\)

1

binární číslo

\(\color{blue}{1}\)

\(\color{blue}{1}\)

0

\(\color{blue}{1}\)

\(\color{blue}{1}\)

0

\(\color{blue}{1}\)

0

0

0

tohle sečteme

0

\(\color{blue}{512}\)

\(\color{blue}{256}\)

0

\(\color{blue}{64}\)

\(\color{blue}{32}\)

0

\(\color{blue}{8}\)

0

0

0

Binární číslo píšeme do tabulky zprava doleva, je to lepší.

Výsledek je \(\color{blue}{512+256+64+32+8}=\mathbf{872}\)

Převod čísla z desítkové do dvojkové soustavy

První způsob

Mějme třeba číslo \(986_{10}\) a převeďme ho do dvojkové soustavy.

Začneme tak, že se zeptáme: "Jaká největší mocnina dvojky se nám vejde do 986?". Největší mocnina dvojky, která se vejde do čísla 986 je \(2^9=512\). Zapíšeme si dvojkovou jedničku na devátém řádu našeho dvojkového čísla a odečteme od desítkového čísla tuto mocninu \(986-512=474\).
A budeme pokračovat dále. Jaká další největší mocnina dvojky menší než 512 se vejde do čísla 474? 256. Do našeho dvojkového čísla si opět napíšeme jedničku na 8. řádu.
Odečteme od čísla \(474-512\) a vyjde nám 218. Jedeme dále. Jaká další největší mocnina dvojky, menší než 256 se nám vejde do čísla 218? 128. Do našeho dvojkového čísla napíšeme jedničku na 7. řádu.
Odečteme \(218-128=90\). Jedeme dále, jaká další největší mocnina dvojky menší než 128 se nám vejde do čísla 90? 64. Do našeho dvojkového čísla si napíšeme jedničku na 6. řádu.
Odečteme \(90-64=26\). Jedeme dále, jaká další největší mocnina dvojky menší než 64 se nám vejde do čísla 26? 32 se tam nevejde, zapíšeme si do našeho dvojkového čísla nulu na 5. řádu a pokračujeme.
Jaká další mocnina se vejde do 26? 16 se tam vejde, do našeho dvojkového čísla zapisujeme jedničku na 4. řádu a odečteme \(26-16=10\)
Tento postup děláme tak dlouho, dokud nám nevyjde 0. Přehledně je to vidět v tabulce níže.

desítkové číslo mocnina pokračování dvojkové číslo

986

512 se vejde do 986

986-512=474

1 _ _ _ _ _ _ _ _ _

474

256 se vejde do 747

474-256=218

1 1 _ _ _ _ _ _ _ _

218

128 se vejde do 218

218-128=90

1 1 1 _ _ _ _ _ _ _

90

64 se vejde do 90

90-64=26

1 1 1 1 _ _ _ _ _ _

26

32 se nevejde do 26

26

1 1 1 1 0 _ _ _ _ _

26

16 se vejde do 26

10

1 1 1 1 0 1 _ _ _ _

10

8 se vejde do 10

2

1 1 1 1 0 1 1 _ _ _

2

4 se nevejde do 2

2

1 1 1 1 0 1 1 0 _ _

2

2 se vejde do 2

2-2=0

1 1 1 1 0 1 1 0 1 _

0

1 se nevejde do 0

0

1 1 1 1 0 1 1 0 1 0

Kontrolu, že jsme počítali správně můžeme udělat takto (pojedeme u dvojkového čísla zprava doleva, je to přehlednější):

\(111110010_2 = 0\cdot 1+1\cdot 2+ 0\cdot 4+1\cdot 8+1\cdot 16+0\cdot 32+1\cdot 64+1\cdot 128+1\cdot 256+1\cdot 512=2+8+16+64+128+256+512=986\)

Druhý způsob

Desítkové číslo budeme postupně dělit celočíselně číslem 2 dokud nedostaneme 0 a jako binární číslice si budeme zapisovat zbytky po dělení (zprava doleva):

desítkové číslo výsledek dělení zbytek po dělení dvojkové číslo

986

986:2=493

0

_ _ _ _ _ _ _ _ _ 0

493

493:2=246

1

_ _ _ _ _ _ _ _ 1 0

246

246:2=123

0

_ _ _ _ _ _ _ 0 1 0

123

123:2=61

1

_ _ _ _ _ _ 1 0 1 0

61

61:2=30

1

_ _ _ _ _ 1 1 0 1 0

30

30:2=15

0

_ _ _ _ 0 1 1 0 1 0

15

15:2=7

1

_ _ _ 1 0 1 1 0 1 0

7

7:2=3

1

_ _ 1 1 0 1 1 0 1 0

3

3:2=1

1

_ 1 1 1 0 1 1 0 1 0

1

1:2=0

1

1 1 1 1 0 1 1 0 1 0

Tento druhý způsob převodu se mi zdá jednodušší.

Kdo to nepochopil, tak tady je video od pana Marka Valáška: Marek Valášek na Youtube - dvojková soustava, převody

Kde budeme dvojkovou soustavu používat

Při programování na úrovni operačního systému se dvojkové soustavě nevyhneme. Při programování mikrokontrolérů budeme binární soustavu potřebovat hodně. Budeme-li chtět pochopit směrovací tabulku v síťařině, bez dvojkové soustavy se neobejdeme. V mikroelektronice a pokud budete chtít pochopit jak funguje hardware se vám to bude také hodit.

Jedna dvojková číslice se jmenuje bit (čte se bit), dvojkové číslo o osmi číslicích se označuje pojmem byte (čte se bajt).

Pro člověka je ruční počítání ve dvojkové soustavě nepohodlné, jakýkoliv počítač neumí počítat v jiné soustavě než ve dvojkové, kromě jednoho speciálu, který se jmenoval Setuň a byl vyroben v Sovětském svazu v jednom exempláři v letech 1956 až 1958. Tento stroj počítal ve vyvážené trojkové soustavě.

Domácí úkol č.1

Úloha 1.

Převeďte bez kalkulačky desítkové číslo \(8574_{10}\) do dvojkové soustavy.

Úloha 2.

Převeďte bez kalkulačky dvojkové číslo \(11010001_2\) do desítkové soustavy.

Výsledky si zkontrolujte kalkulačkou, pokud to umíte. Úkol vypracujte do sešitu. Kdo umí posílat email, může mi výsledky úkolu poslat buď na můj školní email chraska.jiri@sspvc.cz nebo na firemní jirka@lixis.cz. Do předmětu zprávy uvěďte "OS: domácí úkol č.1". V emailu se nazapomeňte podepsat.

Teamsy a jiný způsob komunikace nepoužívám z bezpečnostních důvodů a ani je nehodlám používat.

Úkol je na příští hodinu, kdo ho nepřinese, dostane kuli. Ostatní dostanou známku podle toho, jak dobře se jim podaří úkol udělat. Kdo chyběl na dnešní hodině a bude se vymlouvat, že chyběl, tak dostane kuli také. Každý může studovat operační systémy třeba pomocí mobilního telefonu kdekoliv a kdykoliv.

Šestnáctková číselná soustava

Šestnáctková poziční číselná soustava používá 16 symbolů: \(\mathbf{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}\).

Symboly \(A, B, C, D, E\ a\ F\) se používají jako číslice s dekadickými hodnotami \(10, 11, 12, 13, 14\ a\ 15\).

Zápis v šestnáctkové (hexadecimální) soustavě bývá doplněn o znak H nebo h použitý jako dolní index za poslední číslicí, případně zkratkou HEX.

Matematické vyjádření šestnáctkové soustavy

\[x = \sum_{i=0}^{k-1} x_i \cdot 16^i\]

kde \(x =\) číslo; \(k =\) počet číslic (pozic); \(x_i = \{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F\}\); \(16=\) základ soustavy.

Uděláme si tabulku a uvidíme krásnou vlastnost dvojkové a šestnáctkové soustavy.

desítkově dvojkově šestnáctkově

0

0000

0

1

0001

1

2

0010

2

3

0011

3

4

0100

4

5

0101

5

6

0110

6

7

0111

7

8

1000

8

9

1001

9

10

1010

A

11

1011

B

12

1100

C

13

1101

D

14

1110

E

15

1111

F

Jeden byte (8 bitů) můžeme snadno zapsat pomocí dvou šestnáctkových čísel.

Převod z dvojkové do šestnáctkové soustavy je velmi jednoduchý. Dvojkové číslo rozdělíme na čtveřice bitů (nibble) a každé této čtveřici přiřadíme šestnáctkové číslo z tabulky.

Příklad (rozdělení na čtveřice je naznačeno podtžítkem):

\(11010011_2=1101\_0011_2=D3_{16}\)

\(1011101_{2}=0101\_1101_{2}=5D_{16}\) (do osmi binárních číslic nám jedna chybí, proto jsme doplnili vlevo 0)

Obrácený převod ze šestnáctkové do dvojkové soustavy je ještě jednodušší. Každé šestnáctkové číslici přiřadíme z tabulky dvojkovou čtvěřici.

\(BC03_{h}=1011\_1100\_0000\_0011_{2}=1011110000000011_{2}\)

Operace sčítání a násobení bychom definovali obdobně jako u desítkové nebo dvojkové soustavy, jenom tabulky by byly větší.

Pro praktické výpočty je nejlepší použít programátorskou kalkulačku.

V programovacích jazycích se šestnáctkové číslo (literál) píše obvykle takto: 0x5d4a nebo 0x5D4A, písmenka se mohou používat velká i malá, záleží vždy na tom, jak se rozhodnuli tvůrci jazyka.

Koho zajímají podrobnosti, může si přečíst třeba Šestnáctková soustava na Wikipedii.

Jak se ukládají dvojková čísla na počítači

Jsme postaveni trochu před problém, jak zapsat záporné dvojkové číslo a jak s ním počítat. Musíme se nejprve dohodnout, kolika bitové je dané číslo. Následující příklady proto budou pro 8-bitová čísla.

Máme tři možnosti jak zapsat dvojkové číslo v počítači.

  1. přímý kód

  2. doplňkový kód

  3. aditivní kód

Přímý kód

Převedeme absolutní hodnotu desítkového čísla do dvojkové soustavy a před číslo doplníme znak znaménka (0 je kladné číslo, 1 je záporné číslo). Pro osmibitové číslo je jeden bit vyhrazený pro znaménko a sedm pro absolutní hodnotu čísla.

Můžeme tedy uložit do 8 bitů čísla z intervalů \(\langle+0, 127\rangle\ a\ \langle-127, -0\rangle\).

Číslo \(65_{10}\) je uložené takto: primy kod kladne

Číslo \(-65_{10}\) je uložené takto: primy kod zaporne

Ale máme trochu problém, protože v přímém kódu se vyskytují dvě nuly.

Kladná nula \(+0\):

primy kod kladna nula

Záporná nula \(-0\):

primy kod zaporna nula

Doplňkový kód

Převedeme absolutní hodnotu čísla do dvojkové soustavy. Pokud je číslo kladné, pak je to výsledek. Pokud je číslo záporné, pak znegujeme všechny bity (z 0 uděláme 1 a z 1 uděláme 0) a přičteme jedničku.

Číslo \(65_{10}\) v dopňkovém kódu: doplnkovy kod kladne 65

Číslo \(-65_{10}\) v doplňkovém kódu:

Kladné \(65_{10}\) doplnkovy kod zaporne 65 0

Negace 0→1 a 1→0 doplnkovy kod zaporne 65 1

\(+1_{2}=\)

Výsledek doplnkovy kod zaporne 65 2

Záporné číslo se pozná tak, že má na prvním bitu jedničku.

Aditivní kód

Aditivní kód používá aditivní konstantu. Je to číslo, které se ke každému číslu přičítá. Pro osmibitové číslo se používá nejčastěji číslo 127 nebo 128. Je možné ale použít jakékoliv číslo. Toto číslo musí být konstantní pro celý systém čísel, který v projektu používáme.

Pro osmibitové číslo a aditivní konstantu 127 budou čísla zapsána takto

\(+65_{10}\) bude: \(+65_{10}+127_{10}=192_{10}=11000000_{2}\)

\(-65_{10}\) bude: \(-65_{10}+127_{10}=62_{10} =111110_{2}\)

Číslo \(+65_{10}\) v aditivním kódu: aditivni kod kladne 65

Číslo \(-65_{10}\) v aditivním kódu: aditivni kod zaporne 65


Pro šestnáctibitová čísla (2 byte) bude počet chlívků, kam se píše 0 a 1 šestnáct.

Pro třicetidvoubitová čísla (4 byte) bude počet chlívků 32.

Pro šedesátičtyřbitová čísla (8 byte) bude počet chlívků 64.

Na způsobech kódování se nic nemění.

Číslo \(25419_{10}\) v přímém kódu (16 bitů)

2byte

Číslo \(1665885003_{10}\) v přímém kódu

4byte doplnkovy 0

Bitová negace

4byte doplnkovy 1

\(+1_{2}=\)

Dostáváme číslo \(-1665885003_{10}\) v doplňkovém kódu

4byte doplnkovy 2

Příklad na 64bitové číslo se už nevejde na monitor, tak ho vynechám.

Zdroje a odkazy