Załóżmy, iż chcielibyśmy otrzymać kod dwójkowy, w którym zachowany byłby naturalny porządek rosnący kolejnych słów kodowych. Na przykład dla 3 bitowego kodu słowa kodowe kolejnych liczb układałyby się następująco: 000, 001, 010, 011, 100, 101, 110, 111. Słowo kodowe 000 powinno określać liczbę najmniejszą, a słowo kodowe 111 liczbę największą. Dotychczas poznane kody liczb binarnych ze znakiem nie spełniają tego warunku:
Kolejność 3 bitowych słów kodowych ZM 111
(-3)110
(-2)101
(-1)100
0000
0001
1010
2011
3U1 100
(-3)101
(-2)110
(-1)111
0000
0001
1010
2011
3U2 100
(-4)101
(-3)110
(-2)111
(-1)000
0001
1010
2011
3Umówmy się zatem, iż wartość binarna słowa kodowego jest równa kodowanej liczbie pomniejszonej o pewną stałą zwaną nadmiarem (ang. excess lub bias). W zależności od tej stałej słowa kodowe będą oznaczały różne liczby. W poniższej tabelce zebraliśmy kilka przykładów takich kodów:
Wartości słów kodowych w systemach z nadmiarem KOD Wartości nadmiaru - bias 4 3 2 1 0 (-1) (-2) (-3) (-4) 000 -4 -3 -2 -1 0 1 2 3 4 001 -3 -2 -1 0 1 2 3 4 5 010 -2 -1 0 1 2 3 4 5 6 011 -1 0 1 2 3 4 5 6 7 100 0 1 2 3 4 5 6 7 8 101 1 2 3 4 5 6 7 8 9 110 2 3 4 5 6 7 8 9 10 111 3 4 5 6 7 8 9 10 11 Zwróć uwagę, iż w zależności od nadmiaru możemy otrzymywać różne zakresy kodowanych liczb. Przykładowo dla przedstawionego w tabeli 3 bitowego kodu i nadmiaru 4 otrzymujemy zakres od -4 do 3. Nadmiar można tak dobrać, aby zakres w całości zawierał się po stronie liczb ujemnych lub dodatnich. Zatem kod ten jest bardzo elastyczny pod tym względem.
Do jednoznacznej definicji kodu z przesunięciem potrzebne są dwa parametry: n - ilość bitów słowa kodowego oraz bias - wartość nadmiaru. Znając je możemy jednoznacznie obliczyć wartość każdego słowa kodowego:
Wartość dziesiętna liczby zapisanej w dwójkowym kodzie z nadmiarem
| |||
Dla kodu z nadmiarem bias = 129(10) oblicz wartość słowa kodowego 11111111(BIAS=129).
11111111(BIAS=129) = 27 + 26 + 25 + 24 + 23 + 22 + 21 + 20 - 129
11111111(BIAS=129) = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 - 129
11111111(BIAS=129) = 255 - 129
11111111(BIAS=129) = 126(10).
Dla kodu z nadmiarem bias = 63(10) oblicz wartość słowa kodowego 00011111(BIAS=63).
00011111(BIAS=63) = 24 + 23 + 22 + 21 + 20 - 63
00011111(BIAS=63) = 16 + 8 + 4 + 2 + 1 - 63
00011111(BIAS=63) = 31 - 63
00011111(BIAS=63) = (-32)(10).
Procedura przeliczania liczby dziesiętnej na dwójkowy zapis z nadmiarem
| |||
Przeliczyć liczbę dziesiętną 95(10) na zapis w 8-bitowym kodzie z nadmiarem 129(10).
Obliczamy wartość dziesiętną słowa kodowego:
95 + 129 = 224
Otrzymaną wartość słowa kodowego przeliczamy na system dwójkowy:
224(10) = 11100000(2)
Wyliczone w ten sposób słówko kodowe jest reprezentacją liczby 95 w kodzie dwójkowym z nadmiarem 129:
95(10) = 11100000(BIAS=129)
Przeliczyć liczbę dziesiętną (-24)(10) na zapis w 8-bitowym kodzie z nadmiarem 129(10).
Obliczamy wartość dziesiętną słowa kodowego:
(-24) + 129 = 105
Otrzymaną wartość słowa kodowego przeliczamy na system dwójkowy:
105(10) = 1101001(2)
Wyliczone w ten sposób słówko kodowe uzupełniamy jednym bitem zero do długości 8 bitów otrzymując zapis liczby (-24)(10) w kodzie dwójkowym z nadmiarem 129:
(-24)(10) = 01101001(BIAS=129)
Słowa kodowe tworzą ciąg rosnący w naturalnym systemie binarnym. Najmniejszym co do wartości słowem kodowym jest 0...0, a największym 1...1. Zakres będzie zatem zawierał się w przedziale liczb całkowitych od wartości dziesiętnej pierwszego słowa kodowego do wartości dziesiętnej ostatniego słowa kodowego.
Zgodnie z podanym na początku wzorem obliczania wartości liczby zapisanej w kodzie dwójkowym z nadmiarem pierwsze słowo kodowe ma wartość:
min(BIAS) = 0...0(BIAS) = 0 - bias
Ostatnie słowo kodowe ma wartość:
max(BIAS) = 1...1(BIAS) = 2n - 1 - bias
Zatem:
Zakres n bitowej liczby dwójkowej w kodzie z nadmiarem bias Z(BIAS) = (-bias, 2n - 1 - bias)
| |||
4 bitowe liczby w kodzie z nadmiarem bias = 8 = 23 posiadają zakres:
od -bias = -8 = 0000(BIAS=8) do 24 - 1 - bias = 7 = 1111(BIAS=8) 8 bitowe liczby w kodzie z nadmiarem bias = 128 = 27 posiadają zakres:
od -bias = -128 = 00000000(BIAS=128) do 28 - 1 - bias = 127 = 11111111(BIAS=128) 16 bitowe liczby w kodzie z nadmiarem bias = 32768 = 215 posiadają zakres:
od -bias = -32768 = 0000000000000000(BIAS=32768) do 216 - 1 - bias = 32767 = 1111111111111111(BIAS=32768)
|
Dodawanie
Aby ustalić reguły dodawania liczb zapisanych w dwójkowym kodzie z nadmiarem dokonajmy prostych wyliczeń. Kod binarny liczby w zapisie z nadmiarem ma wartość:
c(BIAS) = liczba + bias
Suma dwóch kodów da nam:
c1 (BIAS) = liczba1 + bias
c2 (BIAS) = liczba2 + biasc1 (BIAS) + c2 (BIAS) = (liczba1 + liczba2) + 2 x bias
Wynika stąd, iż prosta suma dwóch słów kodowych prowadzi do wyniku, który jest za duży o wartość nadmiaru. Aby zatem otrzymać słowo kodowe odpowiadające sumie liczb, należy od wyniku dodawania odjąć nadmiar:
c1+2 (BIAS) = (liczba1 + liczba2) + bias = c1 (BIAS) + c2 (BIAS) - bias
Wykonać operację 0011(BIAS=7) + 1010(BIAS=7).
0011 + 1010 1101 - 0111 0110 0011(BIAS=7) + 1010(BIAS=7) = 0110(BIAS=7).
Sprawdźmy, czy otrzymaliśmy poprawny wynik. W tym celu policzymy wartość wszystkich słówek kodowych:
0011(BIAS=7) = 3 - 7 = -4
1010(BIAS=7) = 10 - 7 = 3
0110(BIAS=7) = 6 - 7 = -1-4 + 3 = -1 - wynik prawidłowy
Odejmowanie
Przy wyprowadzeniu wzoru na odejmowanie postąpimy podobnie jak dla dodawania:
c(BIAS) = liczba + bias
Różnica dwóch kodów da nam:
c1 (BIAS) = liczba1 + bias
c2 (BIAS) = liczba2 + biasc1 (BIAS) - c2 (BIAS) = (liczba1 - liczba2)
Wynika stąd, iż prosta różnica dwóch słów kodowych prowadzi do wyniku, który jest za mały o wartość nadmiaru. Aby zatem otrzymać słowo kodowe odpowiadające różnicy liczb, należy do wyniku odejmowania dodać nadmiar:
c1-2 (BIAS) = (liczba1 - liczba2) + bias = c1 (BIAS) - c2 (BIAS) + bias
Wykonać operację 1011(BIAS=7) - 1110(BIAS=7).
1011 - 1110 11101 + 0111 10100 1011(BIAS=7) + 1110(BIAS=7) = 0100(BIAS=7).
Sprawdźmy, czy otrzymaliśmy poprawny wynik. W tym celu policzymy wartość wszystkich słówek kodowych:
1011(BIAS=7) = 11 - 7 = 4
1110(BIAS=7) = 14 - 7 = 7
0100(BIAS=7) = 4 - 7 = -34 - 7 = -3 - wynik prawidłowy
Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.
Źródło: mgr Jerzy Wałaszek