Informatyka kodowanie liczb dr hab. inż. Mikołaj Morzy plan wykładu definicja informacji sposoby kodowania reprezentacja liczb naturalnych i całkowitych arytmetyka binarna arytmetyka oktalna arytmetyka heksadecymalna czym jest informacja? informacja (łac. informatio) wyobrażenie, idea, wielkość abstrakcyjna przechowywana w pewnych obiektach, przesyłana między obiektami, przetwarzana w obiektach i stosowana do sterowania obiektami. Obiektami mogą być organizmy żywe, urządzenia techniczne oraz systemy takich obiektów. prof. Antoni Mazurkiewicz informacja to powiadamianie społeczeństwa lub określonych zbiorowości w sposób zobiektywizowany, systematyczny i konkretny za pomocą środków masowego przekazu encyklopedia PWN mierzenie i badanie informacji informacją zajmuje się dyscyplina naukowa zwana Teorią Informacji (ang. Information Theory) stworzona przez Claude'a Shannona w 1948 roku bada inherentne ograniczenia przetwarzania sygnałów dziedziny: kompresja danych, przechowywanie i komunikacja danych, wnioskowanie statystyczne, NLP, kryptografia mierzy informację ilościowo i jakościowo aby zaistniała informacja, konieczna jest możliwość porównania dwóch stanów, brak zmian oznacza brak informacji jednostki informacji maszyny przechowują dane w postaci liczb binarnych bit (b): pojedyncza cyfra reprezentuje dwa stany: 0 i 1, jest to najmniejsza niepodzielna jednostka informacji cyfrowej bity grupuje się w bajty (B), najczęściej 1B=8b nazwa wartość użycie nazwa kilobajt (kB) 103 210 kibibajt (KiB) megabajt (MB) 106 220 mebibajt (MiB) gigabajt (GB) 109 230 gibibajt (GiB) terabajt (TB) 1012 240 tebibajt (TiB) petabajt (PB) 1015 250 pebibajt (PiB) eksabajt (EB) 1018 260 eksbibajt (EiB) zettabajt (ZB) 1021 270 zebibajt (ZiB) jottabajt (YB) 1024 280 jobibajt (YiB) pozycyjny system liczbowy pozycyjny system liczbowy to para (q; C ) q ≥ 2, C = {0,1, K, q − 1} q nazywamy podstawą systemu C jest zbiorem dozwolonych cyfr Liczba jest przedstawiana jako ciąg cyfr w systemie pozycyjnym wartość cyfry zależy od miejsca w ciągu w systemie wagowym każdej pozycji przypisana jest inna waga n L = ∑ ci q i =m i ci ∈ C , m ≤ 0, n ≥ 0, m ≤ n przykłady system dziesiętny: 5703,32(10) 3 L = ∑ ci 10i 2 ⋅10 − 2 + 3 ⋅10 −1 + 3 ⋅100 + 0 ⋅101 + 7 ⋅10 2 + 5 ⋅103 i = −2 system binarny: 110101(2) 5 L = ∑ ci 2i 1⋅ 20 + 0 ⋅ 21 + 1⋅ 2 2 + 0 ⋅ 23 + 1⋅ 2 4 + 1⋅ 25 = 53(10) i =0 system heksadecymalny: 31BD(16) 3 L = ∑ val (ci )16i 13 ⋅160 + 11⋅161 + 1 ⋅16 2 + 3 ⋅163 = 12733(10) i =0 wybrane wartości dziesiętne w systemie binarnym zapis w systemie binarnym wartość w systemie dziesiętnym 1 20=1 10 21=2 100 22=4 1000 23=8 10000 24=16 100000 25=32 1000000 26=64 10000000 27=128 100000000 28=256 1000000000 29=512 10000000000 210=1024 konwersja liczb dziesiętnych do systemu binarnego algorytm dziel liczbę dziesiętną przez 2 zapamiętując reszty z dzielenia zapisz reszty w odwrotnej kolejności liczba dziesiętna wynik dzielenia reszta 2436 1218 0 1218 609 0 609 304 1 304 152 0 152 76 0 76 38 0 38 19 0 19 8 1 8 4 0 4 2 0 2 1 0 1 0 1 2436(10)=100010000100(2) ćwiczenie samodzielne skonwertuj do postaci binarnej liczbę 4813(10) liczba dziesiętna wynik dzielenia reszta 4813 2406 1 2406 1203 0 1203 601 1 601 300 1 300 150 0 150 75 0 75 37 1 37 18 1 18 9 0 9 4 1 4 2 0 2 1 0 1 0 1 4813(10)=1001011001101(2) zamiana ułamka dziesiętnego na binarny algorytm przemnóż całą liczbę przez 2 zapamiętaj część całkowitą, a część ułamkową przemnóż ponownie przez 2 kontynuuj aż część ułamkowa będzie równa 0 zapisz części całkowite liczba iloczyn cz. całkowita cz. ułamkowa 0.71875 1.4375 1 0.4375 0.4375 0.875 0 0.875 0.875 1.75 1 0.75 0.75 1.5 1 0.5 0.5 1.0 1 0 0.71875(10)=0.10111(2) ćwiczenie samodzielne skonwertuj do postaci binarnej liczbę 0.28125(10) liczba iloczyn cz. całkowita cz. ułamkowa 0.28125 0.5625 0 0.5625 0.5625 1.125 1 0.125 0.125 0.25 0 0.25 0.25 0.5 0 0.5 0.5 1.0 1 0 0.28125(10)=0.01001(2) zwiększanie liczby binarnej o 1 algorytm wskaż najmniej znaczący bit liczby powtarzaj następującą sekwencję kroków jeśli wskazany bit jest równy 0, to ustaw bit na 1 i zakończ algorytm jeśli wskazany bit jest równy 1, to ustaw bit na 0 i wskaż następny znaczący bit, jeśli wskazany bit jest najbardziej znaczącym bitem liczby, to dodaj 1 na początku liczby i zakończ algorytm liczba 10011(2)=19(10) liczba 01111(2)=15(10) 10011 01111 10010 01110 10000 01100 10100 = 20(10) 01000 00000 10000 = 16(10) porównywanie liczb binarnych algorytm jeśli liczby są różnej długości, to dłuższa liczba jest większa jeśli liczby są równej długości, to porównaj liczby bit po bicie od najbardziej znaczącego bitu jeśli oba bity są takie same, to przejdź do kolejnego bitu jeśli bity są różne, to większą liczbą jest ta, która ma na danej pozycji 1 liczba znak liczba 1011010 > 1010010 1111000 < 1111010 10000 > 1111 111100 ? 101100 101010 ? 101011 100111 ? 111000 podstawowe operacje arytmetyczne w układzie binarnym dodawanie i mnożenie + 0 1 * 0 1 0 0 1 0 0 0 1 1 10 1 0 1 algorytm dodawania dwie liczby binarne akak-1…a1a0 i bkbk-1…b1b0 dla każdej pozycji obliczamy bit sumy si i bit przeniesienia ci s0 = (a0 + b0 ) mod 2 c0 = a0 *b 0 kolejne bity, od i-tego do k-tego obliczamy według wzoru si = (ai + bi + ci −1 ) mod 2 bit przeniesienia ci jest ustawiany na 1 jeśli co najmniej dwie zmienne spośród ai, bi, ci-1 są ustawione na 1 dodawanie liczb binarnych : przykład 1 0 + 1 21(10) 1 1 1 7(10) 1 1 0 0 28(10) 1 1 1 1 1 31(10) 1 0 0 0 8(10) 0 0 1 1 1 39(10) 1 0 1 0 1 21(10) 1 1 0 1 13(10) 0 0 1 0 34(10) + 1 0 1 + 1 1 0 zadanie samodzielne dodaj binarnie liczby 1001(2) i 1001(2) + 1 1 0 0 1 9(10) 1 0 0 1 9(10) 0 0 1 0 18(10) odejmowanie liczb binarnych algorytm odejmuj liczby bit po bicie od najmniej znaczącego bitu jeśli odjemnik jest większy od odjemnej, "pożycz" dwa bity z kolejnej bardziej znaczącej pozycji 1 2 2 2 0 1 0 1 21(10) 1 1 1 7(10) 0 1 1 1 0 14(10) 1 1 1 1 1 31(10) 1 0 0 0 8(10) 0 1 1 1 23(10) 1 zadanie samodzielne odejmij binarnie liczby 10101(2) i 1101(2) 1 0 2 0 1 0 1 2110) 1 1 0 1 13(10) 1 0 0 0 8(10) mnożenie i dzielenie przez 2 algorytm aby pomnożyć liczbę przez 2, przesuń wszystkie bity w lewo o jedną pozycję, a na ostatniej pozycji umieść 0 aby podzielić bez reszty liczbę przez 2, przesuń wszystkie bity w prawo o jedną pozycję, tracąc najmniej znaczący bit 1 0 1 0 * 1 1 21(10) 2 0 1 0 1 0 42(10) 1 1 0 0 1 25(10) ÷ 2 1 1 0 0 12(10) wady układu binarnego mimo licznych zalet, układ binarny posiada wady zapis dużej liczby zajmuje dużo więcej miejsca niż w przypadku zapisu dziesiętnego zapis binarny jest wygodny w odniesieniu do liczb naturalnych, dla liczb rzeczywistych lub ujemnych zapis się komplikuje system ósemkowy (oktalny) podstawą systemu jest liczba 8 liczby zapisywane są przy użyciu cyfr 0, 1, …, 7 system oktalny jest pozycyjnym systemem wagowym, w którym poszczególne pozycje mają wartość 1, 8, 64, 512, 4096, … system oktalny trzykrotnie skraca zapis liczby binarnej współcześnie system oktalny wychodzi z użycia system szesnastkowy (heksadecymalny) podstawą systemu jest liczba 16 liczby zapisywane są za pomocą cyfr 0, 1, …, 9 i liter A, B, C, D, E, F literom odpowiadają liczby A(10), B(11), C(12), …, F(15) kod heksadecymalny bardzo łatwo konwertuje się do kodu binarnego 1100 0010 1010 0111 (2) = C2A7 (16) 12(10)=C(16) 10(10)=A16) 2(10)=2(16) 7(10)=7(16) dodawanie liczb heksadecymalnych dodawanie metodą pośrednią (przez kod dziesiętny) 28F(16) 2*256+8*16+15*1 655(10) + 37F(16) 3*256+7*16+16*1 +895(10) 60E(16) 6*256+0*16+14*1 1550(10) dodawanie bezpośrednie F(16)+F(16)=15(10)+15(10)=30(10) 30(10):16(10)=1 reszta 14(10)=1 reszta E(16) 1+8(16)+7(16)=1+8(10)+7(10)=16(10) 16(10):16(10)=1 reszta 0(10)=1 reszta 0(16) 1+2(16)+3(16)=1+2(10)+3(10)=6(10) 6(10):16(10)=0 reszta 6(10)=0 reszta 6(16) zadanie samodzielne dodaj heksadecymalnie liczby AF(16) i 87(16) F(16)+7(16)=15(10)+7(10)=22(10) 22(10):16(10)=1 reszta 6(10)=1 reszta 6(16) 1+A(16)+8(16)=1+10(10)+8(10)=19(10) 19(10):16(10)=1 reszta 3(10)=1 reszta 3(16) AF(16)+87(16)=136(16) reprezentacja liczb całkowitych wcześniejsze kody umożliwiały przechowywanie liczb naturalnych, w celu zapisania liczb całkowitych należy posłużyć się dodatkowym mechanizmem reprezentacja znak-moduł: (ZM) najbardziej znaczący bit informuje o znaku liczby (0 - liczba dodatnia, 1- liczba ujemna) reprezentacja uzupełnienia do dwóch (U2): waga najbardziej znaczącego bitu przyjmuje wartość dodatnią (0) lub ujemną (1), pozostałe wagi zawsze są dodatnie reprezentacja znak-moduł przykład znak 64 32 16 8 4 2 1 0 1 0 1 1 0 0 1 znak 64 32 16 8 4 2 1 1 0 0 0 1 1 0 1 +89(10) -13(10) wady algorytmy dodawania i odejmowania liczb binarnych muszą uwzględniać zarówno znak, jak i moduł w reprezentacji występują dwie różne liczby 0 reprezentacja uzupełnienia do dwóch przykład 128 64 32 16 8 4 2 1 0 1 0 1 1 0 0 1 -128 64 32 16 8 4 2 1 1 0 0 0 1 1 0 1 zakres na n bitach można zapisać liczby <-2n-1, 2n-1-1> dla 8 bitów: <-128,127> dla 16 bitów: <-32768, 32767> +89(10) -115 (10) konwersja między ZM i U2 kod ZM liczby całkowitej dodatniej jest także kodem U2 tej liczby +25(ZM)=+25(U2) 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 kod U2 liczby całkowitej ujemnej uzyskujemy z ZM w następujący sposób: bit znaku zamień na 0 wykonaj negację bitową otrzymanego kodu dodaj binarnie jedynkę 1 0 0 1 1 0 0 1 -25(ZM) 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 -25(U2) negacja binarna w kodzie U2 algorytm zaneguj wszystkie bity liczby do otrzymanej w ten sposób liczby dodaj binarnie 1 0 1 0 1 1 0 0 1 +89(U2) 1 0 1 0 0 1 1 0 -90(U2) 1 0 1 0 0 1 1 1 -89(U2) dodawanie binarne w kodzie U2 podczas dodawania w kodzie U2 postępuje się podobnie jak w przypadku zwykłych liczb binarnych, ale ignoruje się pożyczki i przeniesienia poza zakres 0 0 0 0 0 0 0 1 1(U2) + 1 1 1 1 1 1 1 1 -1(U2) 1 0 0 0 0 0 0 0 0 0(U2) 1 0 1 1 0 1 0 1 -75(U2) 0 0 1 1 1 0 0 1 +57(U2) 1 1 1 0 1 1 1 0 -18(U2) + zadanie samodzielne dodaj binarnie w kodzie U2 liczby 57 i -1 0 0 1 1 1 0 0 1 57(U2) + 1 1 1 1 1 1 1 1 -1(U2) 1 0 0 1 1 1 0 0 0 56(U2) odejmowanie binarne w kodzie U2 odejmowanie w kodzie U2 jest realizowane poprzez wyznaczenie binarnej negacji odjemnika i dodaniu jej do odjemnej 0 0 0 0 0 0 1 0 2(U2) - 0 0 0 0 0 1 1 1 7(U2) ~ 1 1 1 1 1 0 0 1 -7(U2) 0 0 0 0 0 0 1 0 2(U2) 1 1 1 1 1 0 0 1 -7(U2) 1 1 1 1 1 0 1 1 -5(U2) + konwersja między długościami liczb czasem zachodzi potrzeba przechowywania liczby n-bitowej w postaci liczby m-bitowej, gdzie m>n reprezentacja znak-moduł przesuń bit znaku maksymalnie w lewo, wolne pozycje wypełnij zerami 1 0 1 1 1 0 0 0 0 0 1 1 reprezentacja uzupełnienia do dwóch przesuń bit znaku maksymalnie w lewo, wolne pozycje wypełnij kopią bitu znaku 1 0 1 1 1 1 1 1 1 0 1 1 kod BCD w wielu przypadkach stosowanie "czystego" kodu binarnego jest nieefektywne ze względu na dużą liczbę konwersji między kodem binarnym i dziesiętnym kasy, liczniki, kalkulatory, wagi, … BCD (ang. binary coded decimal) to system dziesiętny kodowany dwójkowo 1 każda cyfra dziesiętna kodowana binarnie na 4 bitach liczba w kodzie BCD dzielona na 4-bitowe bloki dekodowane niezależnie 0 0 9 1 0 0 1 3 1 0 1 0 4 0 0 1 1 7 1 konwersja między BCD i kodem dziesiętnym bardzo prosta zasada konwersji 1000 0110 0101 0001(BCD) = 8651(10) 9234(10) = 1001 0010 0011 0100(BCD) uwaga niektóre słowa kodowe nie są dozwolone kod BCD nie jest efektywny, ponieważ nie wykorzystuje wszystkich kombinacji bitów 1010 0100 1101 0011(BCD) = ??? 6 ??? 3(10) dodawanie i odejmowanie w kodzie BCD liczby w kodzie BCD nie są naturalnymi liczbami dwójkowymi, dodawanie i odejmowanie wymaga stosowania korekty korekta przy dodawaniu polega na dodaniu do grupy bitów reprezentujących cyfrę dziesiętną liczby 0110(2)=6(10) korekta przy odejmowaniu polega na odjęciu od grupy bitów reprezentujących cyfrę dziesiętną liczby 0110(2)=6(10) korekta jest konieczna, jeśli po operacji arytmetycznej grupa bitów nie reprezentuje cyfry dziesiętnej, lub nastąpiło przeniesienie z/do następnej grupy bitów dodawanie i odejmowanie w kodzie BCD 14 17 0 0 0 1 0 1 0 0 + 0 0 0 1 0 1 1 1 = 0 0 1 0 1 0 1 1 0 1 1 0 + 31 = 0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 - 0 0 0 1 0 1 1 0 = 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 1 31 16 15 = 0 0 0 1 zadanie samodzielne Przeprowadź poniższe operacje w kodzie BCD 23+13 25-4 36+47 51+63 77+88 24-15 29+19 31-18