Priamy kod
V priamom kode predstavuje najvyssi rad znamienko. Zvysok radovej mriezky je absolutna hodnota zobrazovaneho cisla. Znamienko + je reprezentovane 0-ou a - 1-kou.
Formalna definicia hovori, ze obraz cisla A v priamom kode je A pre A vacsie ako 0 a mensie ako z^n, kde n je najvyssi rad, alebo sucet z^n a absolutnej hodnoty A, ak A je mensie ako 0 a zaroven vacsie ako -z^n
P(A) =
- A; 0 =< A < z^n #pre n = 3, z = 2, cislo 2 to znamena, ze 0 =< 2 < 8
- z^n + |A|; -z^n < A =< 0 #pre n = 3, z = 2, cislo -2 to znamena, ze -8 < -2 =< 0
P(-25); z = 10, n = 3
-25 je mensie ako 0, takze bude platit P(A) = z^n + |A| = 10^3 + 25 = 1025. V radovej mriezke to bude
1 | 0 | 2 | 5
P(0,05); z = 10, n = 0, m = 2
0,05 je vacsie ako 0 a zaroven mensie ako z^n (1).
0, | 0 | 5
P(101); z = 2, n = 3, m = 0
101 je mensie ako 2^3 a vacsie ako 0
0 | 1 | 0 | 1
P(-0,11); z = 2, n = 0, m = 3
jedna sa o zaporne cislo, ktore je stale vacsie, ako -1. Preto 1 + 0,75 = 1,75
1, | 0 | 0 | 0
0, | 1 | 1 | 0
1, | 1 | 1 | 0
Tento sposob je dost intuitivny a jednoduchy, ale vsimnite si, ako nam pridanie jedneho bitu znizilo rozsah a zaroven by sme sa mali vyvarovat zapornej 0-y (1,0000), ktora je dostatocne velmi zbytocna :).
Aditivny kod
Tento kod sa obcas oznacuje za "kod s posunutou 0-ou". K zobrazovanemu cislu sa pripocita konstanta a "voila", cislo je na svete :). Toto znie ale az prilis jendoducho na to, aby to bola pravda. Aditivny kod meni sposob interpretacie dat. Hodnotu cisla pred zapisom zvysime o pevne zvolenu konstantu (vacsinou 1/2(z^(n+1))). Tym sa zbavime zapornych cisel. Pri dekodovani zase hodnotu odpocitame.
Formalne vyjadrime zobrazenie cisla takto
Ak(A) = A + K pre -K =< A < Z - K
Obraz cisla A v aditivnom kode, pre ktore plati, ze je vacsie ako -K a mensie ako baza - K, kde K je vhodne zvolena konstanta, je rovny suctu povodneho cisla a konstanty. Zostava nam zvolit K. To sa vacsinou voli ako
- 1/2 * Z, kde z je modul, Z = z^(n+1)
- 1/2 * (Z - epsilon), kde epsilon je jednotkou mriezky (z^-m)
Uvedme si radsej priklad.
-25, z = 10, n = 3, m = 0
K = 1/2 * Z = 1/2 * z^(n+1) = 1/2 * 10^(3+1) = 1/2 * 10^4 = 5000
Ak(A) = -25 + 5000 = 4 | 9 | 7 | 5
+0,05, z = 10, n = 0, m = 3
K = 1/2 * Z = 1/2 * 10^0 = 0,5 je ale prilis malo, tak zvolime Z - epsilon = 1 - 10^(-3) = 1 - 0,999 = 0,001 a to je tiez malo ... pruser je v tom, ze najmensie cislo moze byt 0,999 (z^-m) a my potrebujeme take cislo, aby sme mohli aj toto cislo preklopit, zvolime teda 1-ku.
Ak(A) = 0,05 + 1 = 1, | 0 | 5 | 0
+101, z = 2, n = 3, m = 0
K = 1/2 * Z = 1/2 * 2 ^ (4) = 8 => 1000
Ak(A) = 0101 + 1000 = 1 | 1 | 0 | 1
-0,11, z = 2, n = 0, m = 3
K = 1/2 * Z = 1/2 * 2 ^ 0 = 0,5 .. hmm?
Jednotka = z^-m = 0,999 ... takze zvolime 1,000
Ak(A) =- 0,110 + 1,000 = 0, | 0 | 1 | 0
Doplnkovy kod
Posledny zo serialu kodov v tomto prispevku :). V dalsej casti sa budeme zaoberat operaciami s cislami zapisanymi v tomto kode.
Urcite si spominate na prvy kod. Priamy kod, ktory mal par much, napriklad plytvanie miestom v mriezke. Toto riesi doplnkovy kod. Znamienko v doplnkovom kode je organickou sucastou cisla a takisto, ako aditivny kod, meni interpretaciu cisla. Interpretaciu meni len pre zaporne cisla.
D(A) =
- A; 0 <= A < 1/2 Z
- Z + A; -1/2*Z <= A < 0
-25, z = 10, n = 3, m = 0
Z = 10^(n+1) = 10000
D(A) = 1000 - 25 = 9 | 9 | 7 | 5
+0,05, z = 10, n = 0, m = 3
0<= A < 5000
D(A) = 0, | 0 | 5 | 0
+101, z = 2, n = 3, m = 0
0 <= A < 1/2 * Z
D(A) = 0 | 1 | 0 | 1
-0,11, z = 2, n = 0, m = 3
Z = 2^(1) = 2
D(A) = 10,000 - 00,110 = 1, | 0 | 1 | 0
Doporucujem: http://voho.cz/wiki/kodovani-celych-cisel-v-radove-mrizce/ pre priklady a volne podanie