2.1 Tak trochu o číslech

A máš tu další díl o Ruby. Tentokrát si povíme trošku víc o číslech. Jak asi víš, máme a používáme čísla hlavně v desítkové soustavě. Ajaj. Co to vlastně znamená? Tak se ti to, milý Kubo, pokusím vysvětlit. Desítková soustava (dekadická) obsahuje čísla od 0 do 9, a jak jistě víš, má základ s číslem 10. Proč? Asi podle toho, že člověk má 10 prstů – tedy – aspon normální člověk :-) Počítače ale pracují hlavně s dvojkovou soustavou (binární), kde jsou čísla 0 a 1, osmičkovou soustavou – 0 až 7 a šestnáckovou (hexadecimální) soustavou – čísla jsou zapsána v rozsahu 0-9 a A-F.

Abys pochopil číselné soustavy a jak se počítají, uvedu pár příkladů

Desítková soustava

Vezmeme si například číslo 256. Číslo obsahuje 3 číslice, má tedy pozice 2, 1 a 0 .. na 2. pozici je číslo “2”, na 1. pozici je číslo “5”, a na 0. pozici pak číslo “6”. Číslo pozice pak určuje mocninu základu. 2. pozice je tedy 10^2 = 10*10, 1. pozice pak 10^1=10, 0. pozice pak 10^0=1 .. A každou tutu mocninu vynásobíme zapsaným číslem. Číslo je tedy:

256 = 2*10^2 + 5*10^1 + 6*10^0

Vidíš, že desítková soustava má tedy základ s číslem 10. Pro zápis v Ruby není potřeba nic speciálního, prostě, napíšeš číslo tak, jak je a Ruby pozná, že je to číslo v naší – desítkové – soustavě.

A, koukám, že jsem ti zapomněl říct, co je to to “10^2”. Je to “deset na druhou”. Jinak řečeno druhá mocnina deseti. A ještě jinak řečeno 10^2 je jako 10*10. Stejně tak 10^5 bude 10*10*10*10*10 (deset na pátou). To samé pro ostatní, jak tedy bude 8^3?

Dvojková soustava

Binární soustava je základ pro funkci počítačů. Obsahuje vlastně jen dvě čísla – 0 a 1. Jako žárovka. 0 – nesvítí, 1 – svítí. Říká se tomu “bit”. Jednotka informace. Ukážeme si zase nějaký příklad.  Máme tu binární číslo 0b01010101. Krása. A co s tím teď? Napíšeme si opět pozice. Číslo má osm pozic, opět ta nejvyšší bude jako první. Tzn. 7. pozice (první zleva) bude 2^7, 5. pozice 2^5, 1. pozice 2^1 atd. Napíšu teď všechny pozice tak, jak jdou za sebou a k tomu 0 nebo 1 podle čísla.

číslo = 0*128 + 1*64 + 0*32 + 1*16 + 0*8 + 1*4 + 0*2 + 1*1
číslo = 85
irb(main):002:0> cislo = 0b01010101
=> 85

Jak vidíš, není to nic složitého. Šestnáctkovou soustavu zvládneš jistě také.

Šestnácková soustava

V programování se často setkáš hlavně s dvojkovou, ale ještě více se šestnáctkovou (hexadecimální) soustavou. A proč? Protože zápis v ní je kratší, hlavně pro větší čísla. A také se z ní mnohem snadněji ručně převádí do dvojkové soustavy. Trošku zvláštní je zápis, kde se kromě číslic 0-9 používají i písmena A-F. Převedeme-li písmeno A do desítkové soustavy, pak A označuje číslo 10. B je 11, C je 12 .. Poznáš, jaké číslo představuje písmeno F?

Zase si ukážeme příklad. Vezmene hexa číslo 0x2A5F a převedeme si ho do desítkové soustavy. Délka čísla je 4 znaky – 4 pozice. První zleva bude opět 16^3, druhá zleva 16^2 atd. Číslo tedy bude:

cislo = 2*16^3 + A*16^2 + 5*16^1 + F*16^0
cislo = 2*4096 + 10*256 + 5*16 + 15*1
cislo = 8192 + 2560 + 80 + 15
cislo = 10847

a teď to zkusíme v Ruby

irb(main):006:0> cislo = 0x2A5F
=> 10847

Hexadecimální čísla se tedy v Ruby zapisují s “0x” na začátku. Podle toho Ruby pozná, v jaké číselné soustavě mu zapisuješ číslo.

A jak převést hexa do binární soustavy? Jde to snadno proto, že šestnáctková soustava je vlastně násobkem dvou. Dvou – jako dvojková – binární soustava. Stačí si pak tedy zapamatovat, jak převést čísla od nuly do 15 (0-F) do dvojkové soustavy, a budeš převádět velice jednoduše.

Příklad. Převeď číslo 0x8A5 do binární soustavy. Víme, že 8 se převede jako 0b1000, A (10) je zase 0b1010 a 5 se převede jako 0b0101 .. pak tedy 0x8A5 do dvojkové soustavy bude jako 0b100010100101 :)

Ověříme v Ruby

irb(main):023:0> 0b100010100101
=> 2213

irb(main):024:0> 0x8a5
=> 2213

irb(main):025:0> 0x8a5.to_s(2)
=> "100010100101"

Převody mezi soustavami v Ruby

Tak. A teď ti ještě ukážu, jak převádět mezi různými soustavami. K tomu nám poslouží metoda “to_s”, které jako parametr podstrčíme základ soustavy, do které chceme převádět. Tzn. chceme-li převádět do šestnáctkové, dáme 16. Chceme-li do dvojkové, dáme 2.

Převod z desítkové do hexa:

irb(main):012:0> 10847.to_s(16)
=> "2a5f"

Převod z desítkové do binární:

irb(main):016:0> 25.to_s(2)
=> "11001"

Převod z dvojkové do hexa

irb(main):017:0> 0b11001.to_s(16)
=> "19"

Převod z hexa do dvojkové

irb(main):018:0> 0x19.to_s(2)
=> "11001"

Pro převody do desítkové soustavy nepotřebuješ žádnou speciální funkci, Ruby číslo převede hned do desítkové soustavy.

irb(main):019:0> 0x19
=> 25
irb(main):021:0> 0b11001
=> 25

Asi myslím, že už teď máš plnou hlavu čísel, tak to už ukončíme. A trénuj čísla, já si tě pak vyzkouším. :-)

PS: Představ si, že máš číslo 2310 ve čtyřkové soustavě. Převeď mi to do desítkové a do šestnáckové soustavy. Výsledek napiš do komentáře.

Leave a Reply

Your email address will not be published. Required fields are marked *

− 2 = 6