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))
cout << "decimal: binary: ASCII: " <<
endl;
}
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
a
n-
1
a
n-2
…a
1
a
0
ma rozwinięcie:
a
n-1
a
n-2
…a
1
a
0
= a
n-1
*p
n-1
+a
n-2
*p
n-2
+
…+
a
1
*p
1
+
a
0
*p
0
, gdzie
a
n-1
,
a
n-2
,
…
,
a
1
,
a
0
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*2
3
+0*2
2
+1*2
1
+0*2
0
.
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*10
2
+2*10
1
+3*10
0
.
Dla odróżnienia liczb zapisywanych w danym systemie będziemy często podstawę tego
systemu pisali w dolnym prawym rogu liczby, tj.
1010
2
(liczba jeden zero jeden zero w
systemie dwójkowym),
1010
10
(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ę
110010
2
w systemie dwójkowym.
Mamy:
110010
2
=1*2^5+1*2^4+0*2^3+0*2^2+1*2^1+1*2^0=50
10
Weźmy z kolei liczbę
50
10
w systemie dziesiętnym.
Mamy:
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:
110010
2
Zadanie 1
(a) Zamień liczby 11100111
2
i 0101010
2
na odpowiadające im liczby w systemie dziesiętnym.
(b) Zamień liczby 234
10
i 356
10
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ę 12AB
16
Mamy:
12AB
16
=1*16^3+2*16^2+10*16^1+11*16^0=4779
10
Weźmy z kolei liczbę
4779
16
w systemie szesnastkowym.
Mamy:
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:
12AB
16
Zadanie 2
(a) Zamień liczby AB1
16
i 123AA
16
na odpowiadające im liczby w systemie dziesiętnym.
(b) Zamień liczby 234
10
i 356
10
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: 110011
2
i 110101
2
(b) Dodaj i pomnóż pisemnie liczby: 12A
16
i A12
16
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
(i)128 TB =
?
MB =
?
B
(ii)2 Mb =
?
B
(iii)10 MB =
?
GB
Praca domowa:
1.Dowiedź się w jaki sposób przelicza się liczby
pomiędzy systemami
dwójkowym
i
szesnastkowym
.
2.Dowiedź się jak można
zakodować dźwięk
.
3.Dowiedź się czym dokładnie jest
Unicode
i
UTF
i czym
się od siebie różnią?