Reprezentacja danych w komputerze Zajęcia 2
Informacja W informatyce pojęcie informacji (danych) jest niedefiniowalne, tak jak w matematyce pojęcie zbioru. Można natomiast powiedzieć o jednostkach informacji. I tak podstawową jednostką informacji w informatyce jest bit (b). Bit to jednostka informacji mogąca przyjąć (zakodować) jeden z dwóch stanów, np. prawdę lub fałsz, czarny lub biały, ale w informatyce najczęściej utożsamiamy tą informację z cyframi 0 lub 1. Jednostka ta w informatyce jest bardzo przydatna gdyż da się ją ściśle powiązać z napięciem wytworzonym między dwoma ośrodkami (0 – napięcia brak, 1 – napięcie jest). Ponieważ za pomocą jednostki 1 bit można zapisać tylko dwie różne informacje (czyli bardzo mało informacji), to można by wziąć np. 2 bity. No właśnie, ile różnych informacji można zapisać używając dwóch bitów? 0,0 – pierwsza informacja (np. drzewo) 0,1 – druga informacja (np. samochód) 1,0 – trzecia informacja (np. ptak) 1,1 – czwarta informacja (np. kartka) A zatem cztery różne informacje. Widać jednak, że i to za mało. Powstały więc jednostki wyższych rzędów. 1 Bajt (1 B) = 8 bitów = 2^8 = 256 różnych informacji.
Informacja, cd. Widać już, że 1 Bajt pozwala zakodować, np. wszystkie cyfry 0,…,9, wszystkie małe litery alfabetu a,…,z, duże litery alfabetu A,…,Z, znaki -,=,.,/,\,?,… chyba właściwie wszystkie znaki dostępne na klawiaturze. Można by w skrócie tak to przedstawić, a wszystkie wymienione powyżej znaki zaliczyć do słynnych znaków ASCII (poniżej kod dziesiętny, dwójkowy znaków ASCII o kodzie od 0-127)
Konwerter Poniżej prosty program w C++ pozwalający uzyskać znaki ASCII i ich odpowiednik dwójkowy i dziesiętny z poprzedniego slajdu #include <iostream> using namespace std; int main() { cout << "decimal: binary: ASCII: " << endl; for (int n=0; n<=127; n++) cout << " " << n << " "; for (int i=7; i>=0; i--) int bit = ((n >> i) & 1); cout << bit; } cout << " " << char(n) <<endl; if ((n == 40) || (n == 80)) system("PAUSE"); return 0;
Informacja, cd. Zauważmy, że teraz bez problemu zakodujemy wyraz: Ala, to po prostu ciąg znaków: 01000001|01101100|01100001. Ze zdaniem „Ala ma kota” i z kodowaniem dłuższych zdań, czy wręcz całych książek, możemy mieć już problemy, choć komputer oczywiście nie. I chodzi tu oczywiście o pracochłonność zadania. Zauważmy jednak, że zakodowanie wyrazu Ala nie dwójkowo (używając zer i jedynek), a dziesiętnie (używając cyfr 0,…,9), to już prostsze zadanie dla nas. Ala to samo co: 65|108|97. Widzimy zatem, że 65|108|97= 01000001|01101100|01100001, Przy czy obie te liczby zapisane są w różnych systemach, tj. pierwsza w dziesiętnym (dziesiątkowym), gdzie używamy cyfr 0,1,…,9 a druga w dwójkowym, gdzie używamy cyfr 0,1. Widzimy więc, że pożądaną umiejętnością jest przeliczanie liczb z jednego systemu na drugi. Ogólnie jeśli mamy do czynienia z systemem pozycyjnym o podstawie p, to n-cyfrowa liczba an-1 an-2…a1 a0 ma rozwinięcie: an-1 an-2…a1 a0= an-1*pn-1 +an-2*pn-2+ …+ a1*p1 + a0*p0, gdzie an-1, an-2 , … , a1 , a0 są cyframi danej liczby. Np. Jeśli p=2, to mamy do czynienia z systemem dwójkowym w którym używamy cyfr 0 i 1 i dla przykładu 1010=1*23+0*22+1*21+0*20. Jeśli p=10, to mamy do czynienia z systemem dziesiętnym w którym używamy cyfr 0,1,…,9 i dla przykładu 123=1*102+2*101+3*100. Dla odróżnienia liczb zapisywanych w danym systemie będziemy często podstawę tego systemu pisali w dolnym prawym rogu liczby, tj. 10102 (liczba jeden zero jeden zero w systemie dwójkowym), 101010 (liczba tysiąc dziesięć w systemie dziesiętnym). Uwaga! Potęgę będziemy od tej pory oznaczali symbolem ^ tak jak się to przyjęło robić w programach matematycznych: Derive, Mathematica, itp.
Zamiana systemów dwójkowy <--> dziesiętny Weźmy liczbę 1100102 w systemie dwójkowym. Mamy: 1100102=1*2^5+1*2^4+0*2^3+0*2^2+1*2^1+1*2^0=5010 Weźmy z kolei liczbę 5010 w systemie dziesiętnym. 50 : 2 = 25 i reszta 0 25 : 2 = 12 i reszta 1 12 : 2 = 6 i reszta 0 6 : 2 = 3 i reszta 0 3 : 2 = 1 i reszta 1 1 : 2 = 0 i reszta 1 i koniec. Teraz czytając od końca (tj. z dołu do góry) otrzymujemy: 1100102 Zadanie 1 (a) Zamień liczby 111001112 i 01010102 na odpowiadające im liczby w systemie dziesiętnym. (b) Zamień liczby 23410 i 35610 na odpowiadające im liczby w systemie dwójkowym.
Zamiana systemów szesnastkowy <--> dziesiętny System szesnastkowy, to również bardzo popularny system kodowania znaków w informatyce (np. przy kodowaniu kolorów w systemie RGB). W tym systemie mamy do dyspozycji znaki: 0,1,…,9 oraz dodatkowo znaki A,B,C,D,E,F odpowiadające w systemie dziesiętnym liczbom 10,11,12,13,14,15. Weźmy liczbę 12AB16 Mamy: 12AB16 =1*16^3+2*16^2+10*16^1+11*16^0=477910 Weźmy z kolei liczbę 477916 w systemie szesnastkowym. 4779 : 16 = 298 i reszta 11 298 : 16 = 18 i reszta 10 18 : 16 = 1 i reszta 2 1 : 16 = 0 i reszta 1 i koniec. Teraz czytając od końca (tj. z dołu do góry) otrzymujemy: 12AB16 Zadanie 2 (a) Zamień liczby AB116 i 123AA16 na odpowiadające im liczby w systemie dziesiętnym. (b) Zamień liczby 23410 i 35610 na odpowiadające im liczby w systemie szesnastkowym.
Dodawanie i Mnożenie System dwójkowy i szesnastkowy Zadanie 3 (a) Dodaj i pomnóż pisemnie liczby: 1100112 i 1101012 (b) Dodaj i pomnóż pisemnie liczby: 12A16 i A1216
Kodowanie pozostałych znaków ASCII Patrząc na tablicę kodów ASCII zaprezentowaną na trzecim slajdzie widzimy, że nie ma tam kodów binarnych wielu znaków, np. ą, ć, Ą, Ę, ä, ö, symbolu @, i np. wszystkich znaków alfabetu chińskiego. Problem w tym, że tablica ASCII dla każdego z krajów jest wyposażona w dodatkowe znaki charakterystyczne dla danego państwa i obejmujące kody ASCII o kodzie dziesiętny powyżej numeru 127. I tak dla przykładu dla Polski jest to Latin1 i ma postać: Tak naprawdę w celu ujednolicenia tablicy wszystkich znaków stosowanych przez ludzi we wszystkich krajach wymyślono Unicode. Potrzeba na to kodowanie jednak 2 Bajtów.
Kodowanie biało-czarnego obrazu Obraz normalny: Sposób zakodowania: Obraz powiększony do kodowania: Zakodowanie obrazu: źródło: http://edu.i-lo.tarnow.pl/inf/alg/002_struct/0004.php
Kodowanie kolorowego obrazu Obraz normalny: Sposób kodowania: Obraz powiększony do kodowania: Zakodowanie obrazu: źródło: http://edu.i-lo.tarnow.pl/inf/alg/002_struct/0004.php
Kodowanie tekstu Zadanie 4 Załóżmy, że symbole alfabetu polskiego kodowane są według reguły: Zakoduj zdanie: „ALA MA KOTA”. źródło: http://edu.i-lo.tarnow.pl/inf/alg/002_struct/0004.php
Jednostki informacji Zauważmy, że tak naprawdę jednostka 1B jest bardzo mała i można nią zakodować 256 różnych informacji. A co jeśli chcemy zakodować całą książkę informacji. Trzeba zwiększyć jednostki. I tak, mamy następującą tabelę jednostek i ich przeliczania: źródło: http://edu.i-lo.tarnow.pl/inf/prg/005_pmc1/0002.php Zadanie 5 128 TB = ? MB = ? B 2 Mb = ? B 10 MB = ? GB
Praca domowa: Dowiedź się w jaki sposób przelicza się liczby pomiędzy systemami dwójkowym i szesnastkowym. Dowiedź się jak można zakodować dźwięk. Dowiedź się czym dokładnie jest Unicode i UTF i czym się od siebie różnią?