Wprowadzenie do inżynierii przetwarzania informacji. Ćwiczenie 1. Systemy liczbowe Cel dydaktyczny: Poznanie zasad reprezentacji liczb w systemach pozycyjnych o różnych podstawach. Kodowanie liczb dziesiętnych w systemach: dwójkowym, ósemkowym i szesnastkowym. Wyznaczanie równoważnych postaci liczb w różnych systemach pozycyjnych. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = 127.54 (10). 2. Dokonać konwersji liczby dziesiętnej R = 39.625 (10) na równoważną postać binarną. 3. Dana jest liczba binarna R = 1010.1101 (2). Podać wartość dziesiętną liczby. 4. Dokonać konwersji liczby dziesiętnej R = 0.7 (10) na równoważną postać binarną. 5. Dana jest liczba ósemkowa R = 127.14 (8). Podać wartość dziesiętną liczby. 6. Dokonać konwersji liczby dziesiętnej R = 39.625 (10) na równoważną postać ósemkową. 7. Dana jest liczba szesnastkowa R = 1A0F.C8 (16). Podać wartość dziesiętną liczby. 8. Dokonać konwersji liczby dziesiętnej R = 39.625 (10) na równoważną postać szesnastkową. 9. Dana jest liczba binarna R = 11010011 01111110.1110101 (2). Podać postać ósemkową i postać szesnastkową liczby R. 10. Dokonać konwersji liczby dziesiętnej R = 1274.375 (10) na równoważną postać ósemkową. 11. Dokonać konwersji liczby dziesiętnej R = 65535.78125 (10) na równoważną postać szesnastkową. 12. Podać wszystkie możliwe liczby binarne oraz ich wartości dziesiętne, które można zakodować na pięciu bitach, z których 2 są przeznaczone na część dziesiętną i 3 na część ułamkową.
Wprowadzenie do inżynierii przetwarzania informacji. Ćwiczenie 1. Systemy liczbowe Cel dydaktyczny: Poznanie zasad reprezentacji liczb w systemach pozycyjnych o różnych podstawach. Kodowanie liczb dziesiętnych w systemach: dwójkowym, ósemkowym i szesnastkowym. Wyznaczanie równoważnych postaci liczb w różnych systemach pozycyjnych. 1.1. Reprezentacja liczb rzeczywistych Wprowadzenie teoretyczne Każdą liczbę rzeczywistą można przedstawić w różnych systemach pozycyjnych za pomocą skończonego, niepustego zbioru symboli zwanych cyframi. W systemie dziesiętnym liczby zapisuje się w postaci ciągu cyfr dziesiętnych, reprezentowanych przez znaki: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, np. 3124.77. W systemie dwójkowym, który jest wykorzystywany w technice cyfrowej, liczby są reprezentowane za pomocą ciągów złożonych ze znaków należących do zbioru {0, 1}. Cyfry takiego zbioru przyjęto nazywać bitami. Na przykład liczba binarna 1001.11 reprezentuje liczbę dziesiętną o wartości 9.75. W ogólnym przypadku liczba rzeczywista R może być zapisana w układzie pozycyjnym o podstawie p > 1 w następujący sposób: R = ±a n-1 a n-2... a 1 a 0.a -1 a -2 a -3... gdzie a k {0,1,..., (p-1)} są cyframi w układzie liczbowym o podstawie p, n-1 numer pozycji o największej wadze. W językach programowania, w celu oddzielenia części całkowitej od ułamkowej, posługujemy się kropką, np. 3124.77, natomiast w matematyce posługujemy się przecinkiem, np. 3124,77. W pozycyjnym systemie liczbowym o podstawie p są używane cyfry a k z zakresu od 0 do p-1. Sposób zapisywania liczb nazywa się pozycyjnym jeśli wartość cyfry zależy od pozycji jaką ta cyfra zajmuje w napisanej liczbie. Każda pozycja ma jednoznacznie określoną, stałą wagę liczbową. Wartość dziesiętna liczby R w układzie o podstawie p jest obliczana ze wzoru: R = ±(a n-1 p n-1 + a n-2 p n-2 +... + a 1 p 1 + a 0 p 0 + a -1 p -1 + a -2 p -2 + a -3 p -3 +...). W przedstawionej reprezentacji waga pozycji a k (waga cyfry a k ) wynosi p k. Inaczej liczbę R można zapisać za pomocą wzoru: R = ± Na przykład liczba R = 123.75 (10) jest reprezentowana w układzie dziesiętnym w postaci: n 1 k= a k p 123.75 (10) = (1 10 2 + 2 10 1 + 3 10 0 + 7 10-1 + 5 10-2 ). k
W układzie dwójkowym liczba R = 123.75 (10) ma następującą reprezentację: 123.75 (10) = 1111011.11 (2) = = 1 2 6 + 1 2 5 + 1 2 4 + 1 2 3 + 0 2 2 + 1 2 1 + 1 2 0 + 1 2-1 + 1 2-2 = = 64 + 32 + 16 + 8 + 0 + 2 + 1 + 0.5 + 0.25 = 123.75. Liczba rzeczywista R składa się z części całkowitej c i ułamkowej u. gdzie n 1 = ± k c a k p, = ± k= 0 k= u a. 1 k k p R = c + u, Jeśli R jest liczbą wymierną, to część ułamkowa 0.a -1 a -2 a -3... zawiera skończoną liczbę cyfr różnych od zera, tzn. począwszy od pewnego k>0 zachodzi a -k =0 (np. 123.75000...), lub zawiera nieskończoną liczbę cyfr różnych od zera, ale wówczas pewne grupy cyfr powtarzają się okresowo, tj. istnieją i>0 oraz k >= 0 takie, że cyfry a -i a -i-1 a -i-2... oraz a -i-k a -i-1-k a -i-2-k... są identyczne (np. liczba wymierna 1/81 = 0. 012345679 012345679... 012345679...). Jeśli R jest liczbą niewymierną, to część ułamkowa 0.a -1 a -2 a -3... zawiera nieskończoną liczbę cyfr bez okresowej regularności od dowolnej pozycji k>0 (np. liczba niewymierna π = 3.1415926536...). 1.2. Kodowanie liczb w systemach cyfrowych Każda liczba rzeczywista R może być zapisana w dowolnym układzie pozycyjnym. Na ogół liczby zapisuje się na z góry ustalonej liczbie pozycji. Na przykład w komputerach podstawową jednostką przetwarzania danych jest słowo maszynowe, np. 8-bitowe, 16-bitowe, 32-bitowe, itd. W przypadku arytmetyki stałopozycyjnej miejsce przecinka jest ustalone, co oznacza, że dokładność reprezentacji (mierzona odległością na osi liczbowej sąsiednich liczb reprezentowanych słowami o danej długości) jest stała. Na przykład zakłada się, że część całkowita liczby może składać się maksymalnie z n cyfr, natomiast część ułamkowa z maksymalnie m cyfr. Wówczas, liczbę R złożoną z n cyfrowej części całkowitej i m cyfrowej części ułamkowej można zapisać w postaci: R = ±(a n-1 p n-1 + a n-2 p n-2 +... + a 1 p 1 + a 0 p 0 + a -1 p -1 + a -2 p -2 +... + a m+1 p -m+1 + a m p -m ) lub w formie skróconej: R = ±a n-1 a n-2... a 1 a 0.a -1 a -2... a -m+1 a -m. Zapis równoważny ma postać: n 1 k= m k R = ± a k p. W przypadku słów 4-bitowych (p=2), w których 2 bity są przeznaczone na kodowanie części całkowitej i dwa bity na kodowanie części ułamkowej można zakodować liczby z dokładnością ¼ = 0.25. Dopuszczalne słowa kodowe to: 00.00 (2) = 0.00 (10), 00.01 (2) = 0.25 (10), 00.10 (2) = 0.50 (10), 00.11 (2) = 0.75 (10),
01.00 (2) = 1.00 (10),... 11.00 (2) = 3.00 (10), 11.01 (2) = 3.25 (10), 11.10 (2) = 3.50 (10), 11.11 (2) = 3.75 (10). W elektronicznych maszynach cyfrowych wykorzystywane są systemy pozycyjne o podstawach p = 2, 8, 16 i 10. Dlatego istotne są wzajemne konwersje między liczbami zapisanymi w tych układach. W przypadku reprezentacji liczb dodatnich wystarczy zakodować daną na ustalonej liczbie pól słowa kodowego. Nieujemna liczba rzeczywista R, składająca się z n-cyfrowej części całkowitej i m-cyfrowej części ułamkowej (razem n+m cyfr), jest reprezentowana w systemach cyfrowych w naturalnym kodzie binarnym (NKB) określonym według wzoru: R n 1 k n 1 n 2 1 0 1 2 m = ak 2 = an 12 + an 2 2 +... + a1 2 + a0 2 + a 12 + a 2 2 +... + a m 2 k= m. Na przykład zapis, 100.1101 (2) jest zapisem skróconym wyrażenia: 100.1101 3 1 k 2 1 0 1 2 3 4 ( 2) = k 2 = 1 2 + 0 2 + 0 2 + 1 2 + 1 2 + 0 2 + 1 2 k= 4 a = = 4.8125. Kodowanie liczb ujemnych wymaga przyjęcia pewnej konwencji reprezentacji znaku. Na przykład można założyć, że najstarszy bit w liczbie binarnej reprezentuje bit znaku. Jeśli wartość bitu znaku jest 1, to liczba jest ujemna. Moduł liczby jest reprezentowany przez pozostałe bity w kodzie NKB. Jeśli wartość bitu znaku jest 0, to liczba jest dodatnia. Zakres reprezentowanych liczb zależy od długości słowa. Za pomocą słowa n-bitowego można przedstawić liczbę całkowitą C z zakresu: (2 1 1) C + (2 1). n 1 n W przypadku arytmetyki zmiennopozycyjnej dokładność reprezentacji zależy od wartości wykładnika. Liczba rzeczywista R jest zapisywana w postaci: R = ) Z E ( 1 S p, gdzie Z jest jednobitowym słowem znaku, p jest wykładnikiem (np. p=2, p=10), S jest n-bitowym słowem mantysy, natomiast E jest m-bitowym słowem wykładnika (cechy). Na przykład: 1 2 R = ( 1) 3.1 2 = 3.1 4 = 12.4.
1.3. Algorytmy konwersji liczb dziesiętnych W praktyce posługujemy się systemem dziesiętnym. W technice komputerowej są również wykorzystywane systemy: dwójkowy, ósemkowy i szesnastkowy. Cyfry wykorzystywane do kodowania liczb w wybranych systemach pozycyjnych: {0, 1} układ dwójkowy, {0, 1, 2, 3, 4, 5, 6, 7} układ ósemkowy, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} układ dziesiętny, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F} układ szesnastkowy (A=10, B=11, C=12, D=13, E=14, F=15). W ogólnym przypadku w układzie pozycyjnym o podstawie p>1 liczby mogą być kodowane za pomocą cyfr należących do zbioru {0, 1,..., (p-1)}, tj. liczba R (p) = ±a n-1 a n-2... a 1 a 0.a -1 a -2... a -m+1 a -m może zawierać wyłącznie cyfry spełniające zależność: 0 a k (p-1). Poniżej przedstawiono przykładowe wartości liczb całkowitych zapisanych w różnych systemach. System dziesiętny System dwójkowy System ósemkowy System szesnastkowy --------------------------------------------------------- 0 0 0 0 1 1 1 1 2 10 2 2 3 11 3 3 4 100 4 4 5 101 5 5 6 110 6 6 7 111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F 16 10000 20 10 17 10001 21 11 18 10010 22 12 19 10011 23 13 20 10100 24 14 100 1100100 144 64 127 1111111 177 7F 255 11111111 377 FF 1000 1111101000 1750 3E8 ---------------------------------------------------------
1.3.1. Algorytm konwersji dziesiętno-binarnej Liczbę całkowitą c, zapisaną w układzie dziesiętnym, sprowadza się do równoważnej postaci binarnej poprzez wielokrotne jej dzielenie przez 2 i zapisywanie kolejnych reszt z dzielenia a 0, a 1, a 2,..., a n-1, które tworzą daną liczbę w dwójkowym systemie pozycyjnym. W ten sposób powstaje sekwencja cyfr liczby począwszy od cyfry najmniej znaczącej do cyfry najbardziej znaczącej. Liczba w układzie dwójkowym ma postać: (a n-1 a n-2...a 1 a 0 ) (2). Przykład 1.1. Konwersja dziesiętno-binarna liczby całkowitej. Niech liczba w układzie dziesiętnym c = 35 (10). Liczbę tę dzieli się wielokrotnie przez dwa zapisując część całkowitą i resztę z dzielenia. Operacja dzielenia kończy się jeśli pojawi się część całkowita równa zero. 35 : 2 = 17 reszta 1 = a 0 (cyfra najmniej znacząca LSD dla binarnych bit a 0 ) 17 : 2 = 8 reszta 1 = a 1 8 : 2 = 4 reszta 0 = a 2 4 : 2 = 2 reszta 0 = a 3 2 : 2 = 1 reszta 0 = a 4 1 : 2 = 0 reszta 1 = a 5 0 - koniec dzielenia Ostatecznie otrzymuje się: c = 35 (10) = 100011 (2). Wyniki dzielenia można zapisywać w tabelce w postaci: p=2 --------- 35 1 a 0 LSD dla całkowitych 17 1 a 1 8 0 a 2 4 0 a 3 2 0 a 4 1 1 a 5 0 - koniec Liczbę ułamkową u zapisaną w systemie dziesiętnym sprowadza się do postaci binarnej mnożąc wielokrotnie przez 2 część ułamkową otrzymywanych iloczynów. Części całkowite otrzymywanych iloczynów tworzą ułamek binarny równy liczbie u, począwszy od cyfry najbardziej znaczącej a -1, aż do cyfry najmniej znaczącej a -m. Zatem, u = (0.a -1 a -2...a -m ) (2).
Przykład 1.2. Konwersja dziesiętno-binarna liczby ułamkowej. Niech liczba w układzie dziesiętnym u = 0.6875 (10). Liczbę tę mnoży się wielokrotnie przez dwa zapisując część ułamkową otrzymanego iloczynu i część całkowitą, która jest kolejną cyfrą liczby ułamkowej. Operacja mnożenia kończy się jeśli pojawi się część ułamkowa równa zero lub cyfry części ułamkowej zaczną się powtarzać w sposób okresowy. 0.6875 2 = 1.375 = 0.375 nadmiar 1 = a -1 (cyfra najbardziej znacząca MSD bit a -1 ) 0.375 2 = 0.75 = 0.75 nadmiar 0 = a -2 0.75 2 = 1.5 = 0.5 nadmiar 1 = a -3 0.5 2 = 1.0 = 0.0 nadmiar 1 = a -4 0.0 - koniec mnożenia Ostatecznie otrzymuje się: u = 0.6875 (10) = 0.1011 (2). Wyniki dzielenia można zapisywać w tabelce w postaci: 0 6875 ------------ a -1 = 1 375 MSD dla ułamków a -2 = 0 75 a -3 = 1 5 a -4 = 1 0 - koniec Przykład 1.3. Konwersja dziesiętno-binarna liczby rzeczywistej R = 21.6. Część całkowita c = 21 (10). 21 : 2 = 10 reszta 1 = a 0 (cyfra najmniej znacząca LSD dla binarnych bit a 0 ) 10 : 2 = 5 reszta 0 = a 1 5 : 2 = 2 reszta 1 = a 2 2 : 2 = 1 reszta 0 = a 3 1 : 2 = 0 reszta 1 = a 4 0 - koniec dzielenia c = 21 (10) = 10101 (2). Część ułamkowa u = 0.6 (10). 0.6 2 = 1.2 = 0.2 nadmiar 1 = a -1 (cyfra najbardziej znacząca MSD bit a -1 ) 0.2 2 = 0.4 = 0.4 nadmiar 0 = a -2 0.4 2 = 0.8 = 0.8 nadmiar 0 = a -3 0.8 2 = 1.6 = 0.6 nadmiar 1 = a -4 0.6 2 = 1.2 = 0.2 nadmiar 1 = a -5 0.2 2 = 0.4 = 0.4 nadmiar 0 = a -6 0.4 2 = 0.8 = 0.8 nadmiar 0 = a -7 0.8 2 = 1.6 = 0.6 nadmiar 1 = a -8 u = 0.6 (10) = 0.1001 1001 1001... (2). Zatem: 21.6 (10) = 10101.1001 1001... (2).
1.3.2. Algorytmy konwersji dziesiętno-ósemkowej i dziesiętno-szesnastkowej Konwersji liczby rzeczywistej R z układu dziesiętnego do ósemkowego dokonuje się poprzez wielokrotne dzielenie jej części całkowitej przez 8 i zapisywanie kolejnych reszt oraz poprzez wielokrotne mnożenie jej części ułamkowej przez 8 i zapisywanie kolejnych nadmiarów. Podobnie realizuje się konwersję dziesiętno-szesnastkową oraz konwersję do dowolnego układu o podstawie p>1. Przykład 1.4. Konwersja dziesiętno-ósemkowa liczby rzeczywistej R = 35.6875. Dopuszczalne cyfry : { 0, 1, 2, 3, 4, 5, 6, 7 }. 35 : 8 = 4 reszta 3 = a 0 (cyfra najmniej znacząca LSD) 4 : 8 = 0 reszta 4 = a 1 0 koniec dzielenia 0.6875 8 = 5.5 = 0.5 nadmiar 5 = a -1 (cyfra najbardziej znacząca MSD) 0.5 8 = 4.0 = 0.0 nadmiar 4 = a -2 0.0 koniec mnożenia R = 35.6875 (10) = 43.54 (8). Przykład 1.5. Konwersja dziesiętno-szesnastkowa liczby rzeczywistej R = 35.6875. Dopuszczalne cyfry : { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F }. 35 : 16 = 2 reszta 3 = a 0 (cyfra najmniej znacząca LSD) 2 : 16 = 0 reszta 2 = a 1 0 koniec dzielenia 0.6875 16 = 11.0 = 0.0 nadmiar 11 = a -1 (cyfra najbardziej znacząca MSD) 0.0 koniec mnożenia R = 35.6875 (10) = 23.B (16). 1.4. Algorytmy konwersji dwójkowo-ósemkowej i dwójkowo-szesnastkowej Do przedstawienia w systemie dwójkowym danych o dużych wartościach liczbowych niezbędne są długie ciągi zerojedynkowe. Aby skrócić zapis wartości danych, stosuje się ósemkowy lub szesnastkowy system liczbowy. W celu dokonania konwersji dwójkowo-ósemkowej należy liczbę dwójkową podzielić na grupy trzybitowe (triady), zaczynając podział od kropki ułamkowej w lewo i w prawo, i zastąpić otrzymane triady ekwiwalentnymi cyframi ósemkowymi. Jeśli triada nie jest pełna to należy dopisać zera. W celu dokonania konwersji dwójkowo-szesnastkowej należy liczbę dwójkową podzielić na grupy czterobitowe (tetrady), zaczynając podział od kropki ułamkowej w lewo i w prawo, i zastąpić otrzymane tetrady ekwiwalentnymi cyframi szesnastkowymi. Jeśli tetrada nie jest pełna to należy dopisać zera.
Przykład 1.6. Konwersja dwójkowo-ósemkowa i dwójkowo-szesnastkowa liczby rzeczywistej R = 35.6875 (10) = 100011.1011 (2). 100011.1011 (2) = 100 011. 101 100 (2) = 43.54 (8) 100011.1011 (2) = 0010 0011. 1011 (2) = 23.B (16). Przykład 1.7. Konwersja dwójkowo-ósemkowa i dwójkowo-szesnastkowa liczby rzeczywistej R = 1964.18359375 (10) = 11110101100.00101111 (2). 11110101100.00101111 (2) = 011 110 101 100. 001 011 110 (2) = 3654. 136 (8) 11110101100.00101111 (2) = 0111 1010 1100. 0010 1111 (2) = 7AC. 2F (16).