• Nie Znaleziono Wyników

2 System dw´ ojkowy

N/A
N/A
Protected

Academic year: 2021

Share "2 System dw´ ojkowy"

Copied!
17
0
0

Pełen tekst

(1)

Matematyka dyskretna Arytmetyka

Andrzej Szepietowski

1 System dziesi¸ etny

Najpowszechniej u˙zywanym sposobem przedstawiania liczb naturalnych jest system dziesi¸etny, gdzie na przyk lad zapis:

178

przedstawia liczb¸e sk ladaj¸ac¸a si¸e z jednej setki, siedmiu dziesi¸atek i o´smiu jedno´sci. Mo˙zemy to zapisa´c w postaci:

178 = 1 · 100 + 7 · 10 + 8 · 1, albo inaczej:

178 = 1 · 102+ 7 · 101+ 8 · 100.

Tak wi¸ec w systemie dziesi¸etnym kolejne cyfry oznaczaj¸a wsp´o lczynniki przy kolejnych pot¸egach liczby dziesi¸e´c, zaczynaj¸ac od najwi¸ekszej, a ko´ncz¸ac na najmniejszej pot¸edze. M´owimy, ˙ze liczba dziesi¸e´c jest podstaw¸a lub baz¸a systemu dziesi¸etnego. W systemie dziesi¸etnym u˙zywamy dziesi¸eciu cyfr:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a zapis:

drdr−1. . . d1d0

oznacza liczb¸e:

dr· 10r+ dr−1· 10r−1+ . . . + d1· 101+ d0· 100, (1) kt´or¸a mo˙zemy te˙z zapisa´c w postaci:

Xr

i=0

di· 10i, (2)

gdzie di s¸a cyframi nale˙z¸acymi do zbioru {0, . . . , 9}.

Liczby mo˙zna te˙z zapisywa´c w systemach z inn¸a baz¸a. Je˙zeli za baz¸e systemu wybierzemy liczb¸e b, to potrzebujemy b cyfr, a zapis:

drdr−1. . . d1d0

oznacza w systemie z baz¸a b liczb¸e:

dr· br+ dr−1· br−1+ . . . + d1· b1+ d0· b0, (3) kt´or¸a mo˙zemy te˙z zapisa´c w postaci:

Xr

i=0

di· bi. (4)

(2)

2 System dw´ ojkowy

W informatyce bardzo wa˙znym systemem jest system dw´ojkowy (binarny), gdzie podstaw¸a jest liczba 2 i gdzie mamy tylko dwie cyfry, 0 i 1 (cyfry w systemie dw´ojkowym nazywa si¸e bitami).

Zapis:

drdr−1. . . d1d0

oznacza liczb¸e:

dr· 2r+ dr−1· 2r−1+ . . . + d1· 21+ d0· 20

lub: r

X

i=0

di· 2i.

Na przyk lad, zapis 110 oznacza w systemie dw´ojkowym liczb¸e:

1 · 22+ 1 · 21+ 0 · 20, czemu w systemie dziesi¸etnym odpowiada:

4 + 2 = 6.

Podobnie zapis:

1101101 oznacza w systemie dziesi¸etnym liczb¸e:

64 + 32 + 8 + 4 + 1 = 109.

W poni˙zszej tabeli przedstawiono kilkana´scie kolejnych liczb w postaci dw´ojkowej i dziesi¸etnej, a w nast¸epnej — kilkana´scie pierwszych pot¸eg liczby 2 w postaci dw´ojkowej i dziesi¸etnej.

dw´ojkowy dziesi¸etny

0 0

1 1

10 2

11 3

100 4

101 5

110 6

111 7

1000 8

1001 9

1010 10

1011 11

1100 12

1101 13

1110 14

1111 15

10000 16

(3)

pot¸ega dw´ojkowy dziesi¸etny

0 1 1

1 10 2

2 100 4

3 1000 8

4 10000 16

5 100000 32

6 1000000 64

7 10000000 128

8 100000000 256

9 1000000000 512

10 10000000000 1024

3 Zwi¸ ekszanie liczby o jeden

Algorytm zwi¸ekszania liczby o jeden. Aby zwi¸ekszy´c o jeden liczb¸e zapisan¸a w systemie dw´ojkowym:

• wskazujemy na ostatni bit,

• powtarzamy, co nast¸epuje:

 je˙zeli wskazany bit jest zerem, to zamieniamy go na jedynk¸e i ko´nczymy algorytm,

 je˙zeli jest on r´owny jeden, to zamieniamy go na zero i wskazujemy nast¸epny bit w lewo;

je˙zeli nie ma nast¸epnego bitu w lewo, to stawiamy jedynk¸e na pocz¸atku liczby i ko´nczymy algorytm.

M´owi¸ac inaczej, szukamy pierwszego zera od prawej strony, zamieniamy go na jedynk¸e, a wszystkie jedynki stoj¸ace za nim zamieniamy na zera. Na przyk lad, liczba o jeden wi¸eksza od liczby

100100111 to

100101000.

Je˙zeli liczba nie zawiera zer, tylko same jedynki, to zamieniamy te jedynki na zera i stawiamy jedynk¸e na pocz¸atku. Na przyk lad, po liczbie

11111 jest liczba

100000.

Zauwa˙zmy, ˙ze podobnie dzia la algorytm zwi¸ekszania o jeden liczb w systemie dziesi¸etnym (lub dowolnym innym systemie). Szukamy pierwszej od prawej cyfry r´o˙znej od dziewi¸atki (najwi¸ekszej cyfry w systemie), zwi¸ekszamy t¸e cyfr¸e o jeden, a wszystkie stoj¸ace za ni¸a dziewi¸atki zamieniamy na zera.

(4)

4 Por´ ownywanie liczb

Algorytm por´ownywania liczb. Aby stwierdzi´c, kt´ora z dw´och liczb jest wi¸eksza, post¸epujemy w nast¸epuj¸acy spos´ob:

• je˙zeli zapisy liczb nie s¸a tej samej d lugo´sci, to wi¸eksz¸a jest liczba z d lu˙zszym zapisem (zak ladamy tu, ˙ze zapis liczby r´o˙znej od zera nie ma zer na pocz¸atku),

• je˙zeli zapisy liczb s¸a r´ownej d lugo´sci, to por´ownujemy bit po bicie od lewej strony do prawej:

 je˙zeli bity s¸a takie same, to przechodzimy do nast¸epnego bitu w prawo,

 je˙zeli bity s¸a r´o˙zne, to ko´nczymy i stwierdzamy, ˙ze wi¸eksza jest ta liczba, kt´ora ma wi¸ekszy bit na tej pozycji,

• je˙zeli wszystkie bity s¸a takie same, to por´ownywane liczby s¸a r´owne.

Na przyk lad:

1011010 > 1010101.

Powy˙zsze liczby s¸a tej samej d lugo´sci i maj¸a takie same trzy pierwsze bity, a r´o˙zni¸a si¸e dopiero czwartym bitem — czwarty bit pierwszej liczby (1) jest wi¸ekszy od czwartego bitu drugiej liczby (0).

5 Operacje arytmetyczne w systemie dw´ ojkowym

Operacje dodawania, mno˙zenia, odejmowania i dzielenia w systemie dw´ojkowym mo˙zna wykonywa´c podobnie do tak zwanych szkolnych pisemnych dzia la´n arytmetycznych w systemie dziesi¸etnym.

Dzia lania w systemie dw´ojkowym s¸a prostsze, poniewa˙z mamy tu tylko dwie cyfry, 0 i 1, i prostsze s¸a operacje na pojedynczych cyfrach.

Zacznijmy od tabliczki dodawania i mno˙zenia. Wygl¸adaj¸a one tak:

+ 0 1

0 0 1

1 1 10

* 0 1

0 0 0

1 0 1

Przypu´s´cmy, ˙ze chcemy doda´c dwie liczby w postaci dw´ojkowej. Zak ladamy tu, ˙ze obie liczby s¸a tej samej d lugo´sci. Je˙zeli nie s¸a, to kr´otsz¸a z nich uzupe lniamy na pocz¸atku zerami.

Algorytm dodawania. Aby doda´c dwie liczby w postaci binarnej:

drdr−1. . . d0, erer−1. . . e0,

dla kolejnych pozycji i od 0 do r obliczamy bit sumy si oraz ci — tak zwany bit przeniesienia do nast¸epnej pozycji:

(5)

• najpierw obliczamy s0 oraz c0:

s0= d0+ e0 (mod 2) (czyli s0 jest reszt¸a z dzielenia d0+ e0 przez 2),

c0 = d0e0,

• nast¸epnie po kolei, dla ka˙zdego i od 1 do r, obliczamy i-ty bit sumy wed lug wzoru:

si = di+ ei+ ci−1 (mod 2),

a bit ci jest jedynk¸a, je˙zeli co najmniej dwa spo´sr´od bit´ow di, ei oraz ci−1 s¸a jedynkami,

• na ko´ncu obliczamy najbardziej znacz¸acy bit sumy:

sr+1= cr. Wynikiem dodawania jest liczba

sr+1sr. . . s0

(mo˙ze si¸e zdarzy´c, ˙ze sr+1= 0).

Na przyk lad, dodawanie liczb 10101 i 111 wygl¸ada nast¸epuj¸aco:

1 0 1 0 1

+ 1 1 1

1 1 1 0 0

Aby odj¸a´c od siebie dwie liczby w systemie dw´ojkowym, odejmujemy bit po bicie od prawej do lewej, a w przypadku gdy trzeba odj¸a´c bit wi¸ekszy od mniejszego, ,,po˙zyczamy” dw´ojk¸e z nast¸epnej (w lewo) pozycji (szczeg´o ly algorytmu pozostawiono jako ´cwiczenie). Na przyk lad, odejmowanie liczb 10101 i 111 wygl¸ada nast¸epuj¸aco:

1 0 1 0 1

− 1 1 1

1 1 1 0

Aby pomno˙zy´c dwie liczby, mno˙zymy pierwsz¸a liczb¸e przez poszczeg´olne cyfry drugiej liczby, a wyniki podpisujemy pod spodem odpowiednio przesuni¸ete wzgl¸edem siebie. Ka˙zdy kolejny wynik jest przesuni¸ety o jedn¸a kolumn¸e w lewo. Nast¸epnie sumujemy te iloczyny. Oto przyk lad mno˙zenia liczb 10101 i 101:

1 0 1 0 1

1 0 1

1 0 1 0 1

0 0 0 0 0

1 0 1 0 1

1 1 0 1 0 0 1

(6)

Zauwa˙zmy, ˙ze pomno˙zenie liczby w postaci dw´ojkowej przez 2 oznacza dopisanie jednego zera na ko´ncu liczby. Podobnie pomno˙zenie przez i-t¸a pot¸eg¸e liczby 2 oznacza dopisanie na ko´ncu liczby i zer. Na przyk lad:

1101101 pomno˙zone przez

1000 daje wynik

1101101000.

R´ownie˙z dzielenie wykonuje si¸e podobnie jak w systemie dziesi¸etnym. Na przyk lad:

1 0 1 0 1

1 1 0 1 0 0 1 : 1 0 1

1 0 1

1 1 0

1 0 1

1 0 1

1 0 1

0 0 0

Je˙zeli liczba jest podzielna przez 2, to ma w postaci binarnej zero na ko´ncu, a je˙zeli dzieli si¸e przez i-t¸a pot¸eg¸e dw´ojki, to ma na ko´ncu i zer. Podzielenie liczby przez 2 oznacza skre´slenie w jej postaci binarnej jednego zera z ko´nca. Na przyk lad:

1010011000 podzielone przez 2 daje:

101001100.

6 Zamiana systemu

Zastan´owmy si¸e teraz, jak przechodzi´c od jednego sposobu przedstawiania liczby do drugiego.

Poniewa˙z b¸edziemy u˙zywa´c r´o˙znych system´ow zapisu liczb, wi¸ec zapis w systemie z baz¸a b oz- naczymy przez:

(drdr−1. . . d1d0)b.

B¸edziemy rezygnowa´c z tego zapisu, je˙zeli nie b¸edzie w¸atpliwo´sci, jakiego systemu u˙zywamy. Przedysku- tujmy to na przyk ladach. Aby przedstawi´c liczb¸e

(110101)2

w postaci dziesi¸etnej, korzystamy ze wzoru 3:

(110101)2 = 1 · 25+ 1 · 24+ 0 · 23+ 1 · 22+ 0 · 21+ 1 · 20,

(7)

i wykonujemy wszystkie rachunki w systemie dziesi¸etnym:

(110101)2 = 1 · 32 + 1 · 16 + 0 · 8 + 1 · 4 + 0 · 2 + 1 · 1 = 32 + 16 + 4 + 1 = (53)10.

Podobnie mo˙zemy post¸epowa´c przy zamianie w odwrotn¸a stron¸e, z systemu dziesi¸etnego na dw´ojkowy.

Najpierw korzystamy ze wzoru 1:

(53)10= 5 · 101+ 3 · 100,

nast¸epnie przedstawiamy cyfry i podstaw¸e systemu 10 w postaci dw´ojkowej i wykonujemy wszystkie dzia lania w systemie dw´ojkowym:

(53)10= (101)2· (1010)2+ (11)2 = (110010)2+ (11)2 = (110101)2.

Ten spos´ob zamiany liczb z postaci dziesi¸etnej na dw´ojkow¸a jest analogiczny do sposobu, w jaki wy˙zej zamieniali´smy liczby z postaci dw´ojkowej na dziesi¸etn¸a. By lby to naturalny spos´ob dla kogo´s, kto swobodnie liczy w systemie dw´ojkowym. Spos´ob ten ma t¸e wad¸e, ˙ze wolno dzia la. Zobaczymy na przyk ladach dwa szybsze algorytmy zamiany postaci liczby z dziesi¸etnej na dw´ojkow¸a.

We´zmy liczb¸e 178. Pierwszy spos´ob polega na tym, ˙ze wyszukujemy najwi¸eksz¸a pot¸eg¸e liczby 2, kt´ora jeszcze jest mniejsza od naszej liczby (w przyk ladzie 128 = 27), nast¸epnie odejmujemy t¸e pot¸eg¸e od naszej liczby i z r´o˙znic¸a post¸epujemy tak samo. Na ko´ncu mamy liczb¸e w postaci sumy pot¸eg dw´ojki. W naszym przyk ladzie wygl¸ada to tak:

178 = 128 + 50 = 128 + 32 + 18 = 128 + 32 + 16 + 2.

Teraz ju˙z latwo zapisa´c nasz¸a liczb¸e w postaci dw´ojkowej:

(178)10= (10110010)2.

Drugi spos´ob polega na kolejnym dzieleniu liczby w spos´ob ca lkowity przez 2 i zapami¸etywaniu reszt z dzielenia. Reszty te zapisane w odwrotnej kolejno´sci tworz¸a zapis binarny liczby. Na przyk lad, we´zmy znowu liczb¸e 178. W poni˙zszej tabeli przedstawiono kolejne ilorazy i reszty.

liczba iloraz reszta

178 89 0

89 44 1

44 22 0

22 11 0

11 5 1

5 2 1

2 1 0

1 0 1

Reszty zapisane w odwrotnej kolejno´sci:

10110010,

(8)

tworz¸a binarny zapis liczby (178)10.

Poprawno´s´c dzia lania tego algorytmu wynika z faktu, ˙ze je˙zeli podzielimy liczb¸e x =

Xr

i=0

di· 2i

przez 2, to reszta z dzielenia wyniesie d0, a iloraz ca lkowitoliczbowy wyniesie:

Xr

i=1

di· 2i−1,

nast¸epne dzielenie przez 2 da reszt¸e d1 oraz iloraz:

Xr

i=2

di· 2i−2,

i tak dalej.

Ostatni spos´ob mo˙zna latwo uog´olni´c na algorytm zamiany liczb z systemu dziesi¸etnego na system z inn¸a baz¸a b. Nale˙zy tylko dzieli´c przez b. Je˙zeli chcemy, na przyk lad, przedstawi´c liczb¸e 60 w systemie tr´ojkowym, to dzielimy j¸a kolejno przez 3 i spisujemy reszty z dzielenia:

liczba iloraz reszta

60 20 0

20 6 2

6 2 0

2 0 2

W wyniku otrzymamy:

(60)10= (2020)3.

7 U lamki

Przypomnijmy najpierw kr´otko, jak przedstawia si¸e u lamek w systemie dziesi¸etnym. Na przyk lad, 0.234

oznacza:

2 · 10−1+ 3 · 10−2+ 4 · 10−3.

U˙zyli´smy kropki do oddzielania cz¸e´sci ca lkowitej od u lamkowej. Jest to cz¸esto u˙zywany w infor- matyce spos´ob, stosowany mi¸edzy innymi w j¸ezyku Pascal.

Og´olniej, zapis:

0.d1d2. . . dr oznacza liczb¸e:

d1· 10−1+ d2· 10−2+ . . . + dr· 10r,

(9)

kt´or¸a mo˙zemy te˙z zapisa´c w postaci:

Xr

i=1

di· 10i.

Podobnie mo˙zemy zapisywa´c u lamki w systemie dw´ojkowym. Jedyna r´o˙znica polega na tym, ˙ze w systemie binarnym podstaw¸a pot¸eg jest dw´ojka i ˙ze u˙zywamy tylko dw´och cyfr, 0 i 1. Tak wi¸ec w systemie dw´ojkowym zapis:

0.d1d2. . . dr

oznacza liczb¸e:

d1· 2−1+ d2· 2−2+ . . . + dr· 2r, lub inaczej:

Xr

i=1

di· 2i. Na przyk lad:

(0.1)2 = (0.5)10, (0.11)2 = (0.75)10, (0.101)2 = (0.625)10.

W poni˙zszej tabeli przedstawiono kilka pierwszych ujemnych pot¸eg liczby 2 w systemie dw´ojkowym i dziesi¸etnym.

2−1 (0.1)2 (0.5)10

2−2 (0.01)2 (0.25)10

2−3 (0.001)2 (0.125)10

2−4 (0.0001)2 (0.0625)10

2−5 (0.00001)2 (0.03125)10

2−6 (0.000001)2 (0.015625)10

8 System szesnastkowy

W informatyce u˙zywa si¸e te˙z systemu szesnastkowego, gdzie podstaw¸a jest liczba 16. Do systemu szesnastkowego potrzebujemy szesnastu cyfr. Zwykle u˙zywa si¸e nast¸epuj¸acych ,,cyfr”:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.

W poni˙zszej tabeli zestawiono cyfry systemu szesnastkowego z odpowiadaj¸acymi im liczbami w systemie dw´ojkowym i dziesi¸etnym.

(10)

szesnastkowy dw´ojkowy dziesi¸etny

0 0000 0

1 0001 1

2 0010 2

3 0011 3

4 0100 4

5 0101 5

6 0110 6

7 0111 7

8 1000 8

9 1001 9

A 1010 10

B 1011 11

C 1100 12

D 1101 13

E 1110 14

F 1111 15

Liczby w systemie szesnastkowym poprzedza si¸e zwykle (na przyk lad w j¸ezyku Pascal) znakiem dolara $. I tak zapis $A1 oznacza liczb¸e w systemie szesnastkowym, kt´ora w systemie dziesi¸etnym ma poni˙zsz¸a posta´c:

$A1 = 10 · 16 + 1 = (161)10.

Dzi¸eki temu, ˙ze 16 jest pot¸eg¸a dw´ojki, prosta jest zamiana postaci liczby z systemu dw´ojkowego na szesnastkowy, i na odwr´ot. Przy zamianie z systemu szesnastkowego na dw´ojkowy wystarczy zamienia´c kolejne cyfry przedstawienia na grupy odpowiednich czterech bit´ow wed lug powy˙zszej tabeli. Na przyk lad liczba, kt´ora w systemie szesnastkowym wygl¸ada tak:

$A91, w systemie dw´ojkowym ma posta´c:

1010|1001|0001.

Przy zamianie z postaci dw´ojkowej na posta´c szesnastkow¸a post¸epujemy odwrotnie. Zast¸epujemy grupy po cztery bity pojedynczymi cyframi. Na przyk lad:

(1110|0011|1011|0000)2 = $E3B0.

Je˙zeli liczba cyfr w postaci dw´ojkowej nie dzieli si¸e przez 4, to uzupe lniamy j¸a zerami na pocz¸atku.

Na przyk lad:

(110|1111|0110|0010)2 = (0110|1111|0110|0010)2 = $6F 62.

W ten spos´ob mo˙zemy u˙zywa´c zapisu szesnastkowego do zwi¸ez lego przedstawiania d lugich ci¸ag´ow bit´ow.

9 Reprezentacja liczb w komputerze

W j¸ezyku Pascal ka˙zda zmienna ma sw´oj typ, kt´ory jest deklarowany na pocz¸atku programu.

Spos´ob przechowywania warto´sci zmiennej zale˙zy od jej typu.

(11)

10 Integer

Zmienne typu integer przechowywane s¸a w dw´och bajtach. Jeden bajt (ang. byte) zawiera osiem bit´ow, tak wi¸ec warto´s´c zmiennej typu integer przechowywana jest w szesnastu bitach. Pierwszy bit oznacza znak. Je˙zeli jest on zerem, to liczba jest dodatnia, je˙zeli jedynk¸a, to ujemna.

Je˙zeli liczba jest dodatnia, to pozosta le pi¸etna´scie bit´ow stanowi binarny zapis tej liczby. Na przyk lad liczba 15 jest przechowywana jako:

0000|0000|0000|1111.

Najwi¸eksz¸a liczb¸e dodatni¸a, jak¸a mo˙zna przechowa´c w zmiennej typu integer, jest:

0111|1111|1111|1111, czyli zero i pi¸etna´scie jedynek. Jest to:

215− 1 = (32767)10.

Liczby ujemne s¸a przechowywane w tak zwanym systemie uzupe lnieniowym. Liczba ujemna o warto´sci bezwzgl¸ednej x jest przedstawiana jako liczba:

216− x

w postaci binarnej. Na przyk lad liczba −1 jest przedstawiona jako:

1111|1111|1111|1111, czyli szesna´scie jedynek. A liczba −3 jako:

1111|1111|1111|1101.

Najmniejsza liczba ujemna, kt´or¸a mo˙zna zmie´sci´c do zmiennej typu integer, to:

1000|0000|0000|0000, czyli jedynka i pi¸etna´scie zer, kt´ora koduje liczb¸e:

−215= (−32768)10.

W j¸ezyku Pascal nie ma ˙zadnego zabezpieczenia przed przekroczeniem maksymalnego lub mini- malnego zakresu liczb typu integer. Je˙zeli, na przyk lad, do liczby 32767, kt´ora jest przechowywana jako:

0111|1111|1111|1111, dodamy jedynk¸e, to otrzymamy:

1000|0000|0000|0000,

kt´ora koduje liczb¸e −32768, i komputer nie zakomunikuje tego przekroczenia.

(12)

11 Real

Liczby typu real s¸a zapisywane w dw´och notacjach:

• sta lopozycyjnej,

• zmiennopozycyjnej.

Liczby w notacji sta lopozycyjnej to, na przyk lad:

0.10, 11.023, 12.0,

czyli notacja dziesi¸etna. Zwr´o´cmy uwag¸e, ˙ze kropka oddziela cz¸e´s´c ca lkowit¸a liczby od cz¸e´sci u lamkowej.

W notacji zmiennopozycyjnej liczba przedstawiona jest w postaci:

mEc,

gdzie m jest mantys¸a, liczb¸a w postaci dziesi¸etnej z przedzia lu 1 ≤ m < 10 lub −10 < m ≤ −1, a c, zwana cech¸a, jest liczb¸a ca lkowit¸a. Zapis mEc oznacza liczb¸e:

m · 10c.

W poni˙zszej tabeli mamy kilka liczb w postaci sta lo- i zmiennopozycyjnej.

4837.92 4.83792E3 0.034 3.4E − 2

−12.0 −1.2E1

Spos´ob przechowywania warto´sci zmiennych typu real jest skomplikowany i nie b¸edzie przedstaw- iony szczeg´o lowo.

12 Inne typy ca lkowite

W j¸ezyku Pascal, opr´ocz integer, mo˙zna u˙zywa´c innych typ´ow ca lkowitych; s¸a to:

• shortint, zawiera liczby ca lkowite z przedzia lu od −128 do 127,

• byte, zawiera liczby ca lkowite z przedzia lu od 0 do 255,

• word, zawiera liczby ca lkowite z przedzia lu od 0 do 65535,

• longint, zawiera liczby ca lkowite z przedzia lu od −2147483648 do 2147483647.

Elementy typu byte i shortint przechowywane s¸a w jednym bajcie (osiem bit´ow) pami¸eci, typu word — w dw´och bajtach, a typu longint — w czterech bajtach pami¸eci. Liczby typu shortint i longint mog¸a by´c dodatnie lub ujemne i s¸a zapami¸etywane w postaci uzupe lnieniowej z pierwszym bitem oznaczaj¸acym znak (podobnie jak liczby typu integer). Elementy typu byte i word mog¸a by´c tylko dodatnie i s¸a przechowywane w postaci dw´ojkowej.

(13)

13 Wyra˙zenia arytmetyczne w j¸ ezyku Pascal

W j¸ezyku Pascal wyra˙zeniami arytmetycznymi s¸a sta le liczbowe, na przyk lad:

234, −123, 0.123, −23.45, 3.21E − 5,

oraz zmienne typ´ow liczbowych (np. integer lub real). Wyra˙zenia mo˙zna tak˙ze budowa´c za pomoc¸a operator´ow arytmetycznych i nawias´ow. Je˙zeli U oraz W s¸a dwoma wyra˙zeniami arytmetycznymi, to wyra˙zeniami arytmetycznymi s¸a tak˙ze:

U+W, U-W, U*W, U/W, (U), U div V, U mod V.

Gwiazdka ∗ reprezentuje tutaj znak mno˙zenia, a operacje div oraz mod to iloraz i reszta z dzielenia ca lkowitoliczbowego (s¸a one opisane dok ladnie w rozdziale o teorii liczb).

Na przyk lad, wyra˙zeniami arytmetycznymi s¸a:

-(2-3)/2+7*4, (2-3)/(3*2), 7 div 2, 7 mod 2.

Je˙zeli x oraz y s¸a zmiennymi liczbowymi, to wyra˙zeniami arytmetycznymi s¸a tak˙ze:

2*x, x*x-2/y.

Dla danego wyra˙zenia mo˙zemy obliczy´c jego warto´s´c. Robi si¸e to wed lug zwyk lych regu l znanych ze szko ly. Najpierw oblicza si¸e wyra˙zenia w nawiasach, potem mno˙zenie i dzielenie (od lewej do prawej), a na ko´ncu dodawanie i odejmowanie (od lewej do prawej).

14 Poszukiwania binarne (binary search)

Znana jest gra w dwadzie´scia pyta´n. W tej grze za pomoc¸a dwudziestu pyta´n, na kt´ore odpowiedzi¸a mo˙ze by´c ,,tak” lub ,,nie”, nale˙zy odgadn¸a´c pomy´slan¸a przez przeciwnika rzecz. Zobaczymy, jak mo˙zna wykorzysta´c binarny system zapisu liczb do opracowania strategii wygrywaj¸acej w tej grze.

Najpierw upro´s´cmy nieco t¸e gr¸e. Za l´o˙zmy, ˙ze mo˙zemy zada´c tylko cztery pytania i ˙ze odgadu- jemy liczb¸e naturaln¸a x ze zbioru:

A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}.

Wtedy nale˙zy zada´c nast¸epuj¸ace cztery pytania:

• Czy liczba x nale˙zy do zbioru A1= {8, 9, 10, 11, 12, 13, 14, 15}?

• Czy x nale˙zy do zbioru A2 = {4, 5, 6, 7, 12, 13, 14, 15}?

• Czy x nale˙zy do zbioru A3 = {2, 3, 6, 7, 10, 11, 14, 15}?

• Czy x nale˙zy do zbioru A4 = {1, 3, 5, 7, 9, 11, 13, 15}?

Dlaczego te cztery pytania wystarcz¸a? Sprawa stanie si¸e jasna, je˙zeli przedstawimy liczby w postaci binarnej. Ka˙zd¸a za pomoc¸a czterech bit´ow (z zerami na pocz¸atku). Wtedy nasz zbi´or wygl¸ada tak:

A = { 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111}.

A pytania wygl¸adaj¸a teraz tak:

(14)

• Czy x nale˙zy do zbioru A1 = {1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111}?

• Czy x nale˙zy do zbioru A2 = {0100, 0101, 0110, 0111, 1100, 1101, 1110, 1111}?

• Czy x nale˙zy do zbioru A3 = {0010, 0011, 0110, 0111, 1010, 1011, 1110, 1111}?

• Czy x nale˙zy do zbioru A4 = {0001, 0011, 0101, 0111, 1001, 1011, 1101, 1111}?

Zauwa˙zmy, ˙ze zbi´or A1 zawiera wszystkie liczby z pierwszym bitem r´ownym jedynce, w A2 s¸a wszystkie liczby z drugim bitem r´ownym jedynce, i tak dalej. Tak wi¸ec nasze pytania s¸a w rzeczy- wisto´sci pytaniami o kolejne bity odgadywanej liczby. Na przyk lad w pierwszym pytaniu pytamy, czy pierwszy bit odgadywanej liczby jest jedynk¸a.

Ale mo˙zna do tych pyta´n podej´s´c inaczej. Najpierw dzielimy zbi´or na po lowy: na liczby mniejsze od o´smiu i na liczby wi¸eksze lub r´owne o´smiu, i pytamy, do kt´orej po lowy nale˙zy odgadywana liczba (dok ladniej pytamy, czy liczba nale˙zy do g´ornej po lowy). Po uzyskaniu odpowiedzi mamy dwa razy w¸e˙zszy przedzia l poszukiwa´n. Przypu´s´cmy, ˙ze odgadywan¸a liczb¸a jest 11. W drugim etapie dzielimy przedzia l

{8, 9, 10, 11, 12, 13, 14, 15}

na po lowy, g´orn¸a:

{12, 13, 14, 15}

i doln¸a:

{8, 9, 10, 11}

i pytamy, do kt´orej po lowy nale˙zy szukana liczba. Po drugiej odpowiedzi przedzia l poszukiwa´n jest ju˙z cztery razy kr´otszy. Po dw´och kolejnych pytaniach przedzia l zaw¸e˙za si¸e do jednej liczby. Drugi spos´ob jest ca lkowicie r´ownowa˙zny pierwszemu, tutaj te˙z pytamy o kolejne bity i otrzymujemy takie same odpowiedzi.

Potrzeba cztery razy kolejno dzieli´c zbi´or na po lowy, aby z pocz¸atkowej d lugo´sci 16 przej´s´c na ko´ncu do d lugo´sci 1. A ile trzeba podzia l´ow, je˙zeli na pocz¸atku mamy n = 2k element´ow?

Po pierwszym podziale nasz zbi´or b¸edzie mia l d lugo´s´c 2k−1, po drugim 2k−2, a po i-tym 2ki. Jak wida´c, potrzeba k = log2n kolejnych podzia l´ow, aby doj´s´c do 1. Tak wi¸ec je˙zeli mamy do dyspozycji 20 pyta´n, to mo˙zemy odnale´z´c jedn¸a spo´sr´od 220 liczb ca lkowitych z przedzia lu od 0 do 220− 1 = 1 048 575.

15 Waga

Zobaczymy teraz, jak mo˙zna wykorzysta´c tr´ojkowy system zapisu liczb. W systemie tr´ojkowym podstaw¸a jest liczba 3, mamy trzy cyfry {0, 1, 2} i zapis

drdr−1. . . d1d0

oznacza liczb¸e:

dr· 3r+ dr−1· 3r−1+ . . . + d1· 31+ d0· 30,

(15)

lub inaczej:

Xr

i=0

di· 3i.

Wyobra´zmy sobie wag¸e szalkow¸a. Na jednej szalce, lewej, k ladziemy jaki´s przedmiot do zwa˙zenia, a nast¸epnie na obu szalkach k ladziemy odwa˙zniki. Je˙zeli waga jest w r´ownowadze, to wa˙zony przed- miot ma wag¸e r´own¸a sumie (nomina l´ow) odwa˙znik´ow po lo˙zonych na prawej szalce minus suma odwa˙znik´ow po lo˙zonych na lewej szalce, obok wa˙zonego przedmiotu. Na przyk lad, je˙zeli na prawej szalce le˙z¸a odwa˙zniki o ci¸e˙zarach 2 i 20 gram´ow, a na lewej odwa˙zniki o wadze 4 i 5 gram´ow, to przedmiot wa˙zy 13 = (20 + 2) − (5 + 4) gram´ow.

Interesuj¸ace nas pytanie brzmi: jakie powinny by´c nomina ly poszczeg´olnych odwa˙znik´ow, aby mo˙zna by lo zwa˙zy´c ka˙zdy ci¸e˙zar o wadze od 1 do N , przy jak najmniejszej liczbie odwa˙znik´ow.

Zak ladamy, ˙ze wa˙zymy tylko przedmioty o ca lkowitych wagach.

Rozpatrzmy najpierw przyk lad czterech odwa˙znik´ow o wagach:

c1, c2, c3, c4.

Ile r´o˙znych ci¸e˙zar´ow mo˙zna odwa˙zy´c za pomoc¸a czterech odwa˙znik´ow? Poniewa˙z ka˙zdy odwa˙znik mo˙ze si¸e znajdowa´c na prawej lub lewej szalce, lub na stole, to mamy 34 = 81 r´o˙znych po lo˙ze´n odwa˙znik´ow. W´sr´od tych po lo˙ze´n jest takie, gdzie wszystkie cztery odwa˙zniki le˙z¸a na stole (wt- edy wa˙zymy zerowy ci¸e˙zar). Ponadto je˙zeli odwa˙zniki le˙z¸a na szalkach i odwa˙zaj¸a ci¸e˙zar W , to zamieniwszy po lo˙zenia odwa˙znik´ow na szalkach (odwa˙zniki z lewej przek ladamy na praw¸a szalk¸e, i na odwr´ot), b¸edziemy odwa˙za´c ci¸e˙zar −W . Tak wi¸ec spo´sr´od 81 u lo˙ze´n odwa˙znik´ow na szalkach tylko

81 − 1 2 = 40

odwa˙za jaki´s dodatni ci¸e˙zar. Oczywi´scie mo˙ze si¸e zdarzy´c, ˙ze dwa r´o˙zne po lo˙zenia odwa˙znik´ow odwa˙zaj¸a ten sam ci¸e˙zar.

Interesuje nas, czy istniej¸a takie cztery odwa˙zniki, za pomoc¸a kt´orych mo˙zna odwa˙zy´c ka˙zdy ci¸e˙zar od 1 do 40. Odpowied´z na to pytanie jest pozytywna. Istniej¸a takie cztery odwa˙zniki, s¸a to:

1, 3, 9, 27.

Zauwa˙zmy, ˙ze nomina ly odwa˙znik´ow to cztery pierwsze pot¸egi liczby 3. Ka˙zde u lo˙zenie tych odwa˙znik´ow odwa˙za ci¸e˙zar:

W = d3· 27 + d2· 9 + d1· 3 + d0· 1, (5) lub inaczej:

W = d3· 33+ d2· 32+ d1· 31+ d0· 30,

gdzie di = 1, je˙zeli odwa˙znik o nominale 3i le˙zy na prawej szalce, di = −1, je˙zeli le˙zy na lewej, i di = 0, je˙zeli le˙zy na stole.

Zobaczymy, ˙ze ka˙zd¸a liczb¸e od 1 do 40 mo˙zna przedstawi´c w postaci 5. Zauwa˙zmy, ˙ze je˙zeli do ci¸e˙zaru W dodamy:

40 = 27 + 9 + 3 + 1,

(16)

to otrzymamy:

W + 40 = (d3+ 1) · 33+ (d2+ 1) · 32+ (d1+ 1) · 31+ (d0+ 1) · 30. Je˙zeli teraz oznaczymy:

ei = di+ 1, dla 0 ≤ i ≤ 3, to otrzymamy:

W + 40 = e3· 33+ e2· 32+ e1· 31+ e0· 30. (6) Zauwa˙zmy, ˙ze ka˙zde ei jest teraz ze zbioru {0, 1, 2} i wz´or 6 przedstawia rozwini¸ecie liczby W + 40 w systemie tr´ojkowym, a poniewa˙z W jest z przedzia lu od 1 do 40, to W + 40 jest z przedzia lu od 41 do 80 i mo˙zna j¸a przedstawi´c za pomoc¸a czterech cyfr w systemie tr´ojkowym.

Powy˙zszy wyw´od sugeruje algorytm odszukiwania po lo˙zenia odwa˙znik´ow dla danego ci¸e˙zaru W . Algorytm wa ˙zenia. Chc¸ac zwa˙zy´c ci¸e˙zar W z przedzia lu od 1 do 40:

• przedstawiamy liczb¸e W + 40 w systemie tr´ojkowym: W + 40 = (e3e2e1e0)3,

• od ka˙zdej cyfry odejmujemy jedynk¸e: di= ei− 1,

• posta´c (d3d2d1d0) okre´sla po lo˙zenie poszczeg´olnych odwa˙znik´ow wed lug zasady:

 je˙zeli di = 1, to odwa˙znik o nominale 3i nale˙zy po lo˙zy´c na prawej szalce,

 je˙zeli di = −1, to na lewej,

 je˙zeli di = 0, to na stole.

Spr´obujmy zwa˙zy´c ci¸e˙zar W = 20 gram´ow. W rozdziale o zamianie systemu obliczyli´smy, ˙ze liczba 60 = 20 + 40 w systemie tr´ojkowym ma posta´c:

(60)10= (2020)3, czyli:

60 = 2 · 27 + 0 · 9 + 2 · 3 + 0 · 1.

Odejmujemy teraz jedynk¸e od ka˙zdej cyfry i otrzymujemy:

(1¯11¯1).

Tutaj ¯1 oznacza −1. Mamy wi¸ec:

20 = 27 − 9 + 3 − 1.

Metod¸e opisan¸a wy˙zej mo˙zna uog´olni´c na wi¸eksz¸a liczb¸e odwa˙znik´ow. Je˙zeli mamy N odwa˙znik´ow o nomina lach:

1, 3, . . . , 3N−1,

to mo˙zemy odwa˙zy´c ka˙zdy ci¸e˙zar W z przedzia lu od 1 do (3N − 1)/2. Nale˙zy rozwin¸a´c liczb¸e W + (3N − 1)/2 w systemie tr´ojkowym, a nast¸epnie od ka˙zdej cyfry rozwini¸ecia odj¸a´c jedynk¸e.

(17)

16 Zadania

1. Zwi¸eksz o jeden nast¸epuj¸ace liczby zapisane w postaci dw´ojkowej: a) 11010011; b) 111111.

2. Por´ownaj nast¸epuj¸ace pary liczb: a) 110011, 110100; b) 11010, 1110.

3. Dodaj (odejmij, pomn´o˙z) w postaci dw´ojkowej nast¸epuj¸ace pary liczb: a) 110011, 110100;

b) 11010, 1110.

4. Napisz dok ladny algorytm odejmowania dw´och liczb w postaci dw´ojkowej.

5. Liczby 81, 126 przedstaw w postaci dw´ojkowej. Jak b¸ed¸a one reprezentowane w komputerze jako sta le typu integer (byte, word)?

6. Nast¸epuj¸ace liczby przedstaw w postaci dw´ojkowej: 6.75, 5.625, $B1, $FF.

7. Nast¸epuj¸ace liczby przedstaw w postaci tr´ojkowej: 80, 120.

8. Nast¸epuj¸ace liczby w postaci dw´ojkowej, 10001101, 100101, przedstaw w postaci: a) dziesi¸etnej, b) szesnastkowej.

9. Opisz algorytm zamiany u lamka z postaci dziesi¸etnej na posta´c dw´ojkow¸a.

10. Ile maksymalnie pyta´n z odpowiedziami TAK/NIE trzeba zada´c, aby odgadn¸a´c liczb¸e z przedzia lu od 0 do 100 000?

11. Jak nale˙zy u lo˙zy´c na szalkach odwa˙zniki o nomina lach 1, 3, 9, 27, aby odwa˙zy´c ci¸e˙zar: a) 35, b) 29?

Cytaty

Powiązane dokumenty

Pokaza´ c, ˙ze ka˙zdy niepusty i ograniczony z g´ ory zbi´ or liczb rzeczywistych (w postaci przekroj´ ow Dedekinda) ma kres g´ orny..

nie jest sze´scianem liczby naturalnej. Udowodnimy, ˙ze liczba spe lniaj aca warunki zadania nie mo˙ze mie´ , c mniej ni˙z 33 cyfry.. Nie istnieje zatem mniej ni˙z 33 cyfrowa

Podlaski Konkurs Matematyczny 2006 Zadania przygotowawcze - klasy drugie..

7. Wyznaczy´ c 95-procentowy przedzia l ufno´sci dla prawdopodobie´ nstwa p, ˙ze wyprodukowana ˙zar´ owka spe lnia norm¸e jako´sci... Firma reklamowa stara si¸e ustali´ c

Kronika

[r]

Zamiast oblicza´ c go od razu wprost z definicji, poszukuj¸ ac najwi¸ ekszego nieze- rowego minora, mo˙zemy po prostu przekszta lca´ c macierz bez zmiany rz¸ edu do takiej postaci,

urządzenie sieciowe, które przekazuje ramki do odpowiedniego wyjścia urządzenia na podstawie adresu docelowego każdej z nichc.