background image

Reprezentacja danych w 

komputerze

Zajęcia 2

background image

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.

background image

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)

background image

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;
}

background image

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-

a

n-2

…a

a

0

 

ma rozwinięcie:

a

n-1 

a

n-2

…a

a

0

= a

n-1

*p

n-1 

+a

n-2

*p

n-2

+

 

…+

 

a

1

*p

+

 

a

0

*p

0

, gdzie 

a

n-1

,

 

a

n-2 

,

 

… 

,

 a

,

 

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.

background image

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.

background image

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.

background image

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

background image

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.

background image

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

background image

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

background image

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

background image

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

background image

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ą?


Document Outline