MATEMATYKA 1 Wstęp do informatyki- wykład 2 Systemy liczbowe Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy Grębosz, Opus magnum C++11, Helion, 2017 B. Stroustrup, Język C++. Kompendium wiedzy. Wydanie IV, Helion, 2014 S. B. Lippman, J. Lajoie, Podstawy języka C++, WNT, Warszawa 2003.
2 System szesnastkowy (heksadecymalny) Zamiana systemu dwójkowego na szesnastkowy Aby zamienić liczbę o podstawie 2 na liczbę o podstawie 16 grupujemy od prawej po 4 bity rozwinięcia binarnego, odczytujemy wartość dziesiętna każdej grupy bitów i podstawiamy odpowiednią cyfrę z systemu szesnastkowego: 101111010110 (2) = 1011 1101 0110 = BD6 (16) =11=B =13=D =6 Zamiana systemu szesnastkowego na dwójkowy Aby zamienić liczbę o podstawie 16 na liczbę o podstawie 2 każdą cyfrę szesnastkową zapisujemy na 4 bitach uzupełniając o ile jest taka potrzeba z przodu odpowiednia ilością zer: BD6 (16) = 1011 1101 0110 = 101111010110 (2) =11=B =13=D =6 Pamiętajmy o konieczności zapisania każdej cyfry szesnastkowej dokładnie na 4 bitach, czyli o uzupełnieniu z przodu o ile zachodzi taka potrzeba odpowiednią ilością zer (tak jak to miało miejsce w powyższym przykładzie dla cyfry 6 która zapisaliśmy jako 0110)
3 Arytmetyka binarna Ćw 3. Liczby 0101 2, 0110 2, 1011 2, 11110011 2, 100111010100 2 zapisać w postaci szesnastkowej Ćw 4. Liczby A1C2D6, F3E5, 2018 zapisać w postaci binarnej. Ćw 5. Liczbę 255 zapisać: bezpośrednio w postaci szesnastkowej, zamienić na postać binarną, a następnie na szesnastkową. Działania na liczbach binarnych 0+0=0 1 0=1 1+0=1 0 0=0 1+1=10 10 1=1 1101 + 101 10010 1+1= 2 czyli w systemie binarnym jest to 0 i 1 na pozycji o jeden wyższej jest to analogia przy dodawaniu dziesiętnym np. 7+6=13 czyli 3 i 1 na pozycji o jeden wyższej (tzw. jeden dalej )
4 Reprezentacja uzupełnieniowa Reprezentacja uzupełnieniowa służy do zapisu liczb całkowitych (dodatnich i ujemnych). Pierwszy bit od lewej jest bitem znaku (0 liczba dodatnia, 1 liczba ujemna), pozostałych n 1 bitów, to liczba zapisana w postaci binarnej, przy czym dla liczb ujemnych przechowuje się reprezentację binarną liczby x uz = 2 n - x (x) u2 = (x) 2 dla 0 <= x <= 2 n-1 1 (2 n x ) 2 dla 2 n-1 <= x < 0 W ten sposób po prawej stronie definicji mamy reprezentacje liczb nieujemnych, które umiemy już liczyć.
5 Reprezentacja uzupełnieniowa Przykłady a) Wyznaczmy reprezentacje liczby -35 na 8 bitach. Aby znaleźć reprezentację uzupełnieniową liczby -35 musimy wyznaczyć reprezentację binarną liczby 2 8 - -35 = 2 8 35= 256-35 = 221. Zatem na podstawie algorytmu Euklidesa dla liczby 221 otrzymujemy -35=(11011101) u2 221 1 110 0 55 1 27 1 13 1 6 0 3 1 1 1 0
6 Reprezentacja uzupełnieniowa b) Wyznaczmy reprezentację liczby -1 na 8 bitach. 2 8 - -1 = 2 8 1= 256-1 = 255 255=(11111111) u2 =-1 Sprawdźmy, że -1+1=0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 nadmiar 1 0 0 0 0 0 0 0 0
7 Reprezentacja uzupełnieniowa c) Liczba 128 na 8 bitach x =128 x uz =2 8 128 = 128 =2 7, po zamianie na postać binarną: x uz =10000000 Ćw 6. Podać 8-bitową reprezentację uzupełnieniową liczb 122, 5 korzystając z definicji.
Reprezentacja uzupełnieniowa - metoda negacji bitów 8 Liczby ujemne możemy reprezentować binarnie tylko przy ustalonej z góry ilości bitów. Najprostszą metodą zamiany jest metoda "negacji bitów" Metoda negacji bitów (dla liczb ujemnych) 1) wyznaczyć n-bitową reprezentację binarną liczby x 2) w uzyskanej reprezentacji zamienić 0 na 1 i 1 na 0 3) do wyniku dodać 1
Reprezentacja uzupełnieniowa - metoda negacji bitów 9 Przykład Przedstawmy reprezentacje liczby -35 na 8 bitach. Najpierw tworzymy w znany już sposób reprezentacje binarną liczby -35 =35 = 100011 teraz uzupełniamy zerami od lewej tą reprezentację do 8-u bitów 00100011 35 1 następnie dokonujemy negacji bitów 0<->1 17 1 0 0 1 0 0 0 1 1 ~ 1 1 0 1 1 1 0 0 8 0 4 0 2 0 1 1 0
Reprezentacja uzupełnieniowa - metoda negacji bitów 10 do takiej reprezentacji dodajemy 1 : 1 1 0 1 1 1 0 0 + 1 1 1 0 1 1 1 0 1 w wyniku czego otrzymujemy reprezentacje uzupełnieniową liczby -35 na 8 bitach : -35 = 11011101 u2. Ćw 7.Wyznaczyć 16-bitowe reprezentacje uzupełnieniowe liczb -128, -1, -55, -44.
Reprezentacja uzupełnieniowa obliczanie wartości dziesiętnej 11 Zamiana liczb ujemnych zapisanych w reprezentacji uzupełnieniowej na liczbę dziesiętną Na podstawie definicji x uz =2 n - x Zatem dla liczb ujemnych x=-2 n +x uz. Ponieważ liczby ujemne na najstarszym bicie mają 1 i -2 n +2 n-1 =-2 n-1, to wartość liczby o reprezentacji uzupełnieniowej x uz= (c n 1, c n 2,..., c 1, c 0 ) u2 jest równa x = 2 n +1 2 n 1 +(c n-2 2 n-2 +...+ c 1 2 1 +c 0 ) = c n 1 2 n 1 +(c n-2 2 n-2 +...+ c 1 2 1 +c 0 ) Czyli najstarszy bit n-bitowej reprezentacji traktujemy jako -2 n-1, a pozostałe tradycyjnie jako wartości, kolejno 2 n-2,,2 0.
Wyznaczanie wartości dziesiętnej liczb w notacji uzupełnieniowej Przykład. Wyznaczyć wartość dziesiętną liczby 11011101uz -2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 1 0 1 1 1 0 1 11011101 uz = -1* 2 8-1 + 1*2 6 + 1*2 4 + 1*2 3 + 1*2 2 + 1= = -128 + (64+16+8+4+1) = -128 + 93 = -35 Podsumowując aby podać wartość dziesiętną liczby zapisanej w notacji uzupełnieniowej podnosimy 2 do potęgi o jeden niższej niż ilość bitów (8-1), tą wartość przemnażamy przez pierwszy bit od lewej ze znakiem minus. Z pozostałych bitów (w tym przypadku 1011101) odczytujemy wartość dziesiętna tak jak dla liczb dodatnich i wartość tą dodajemy do wcześniej otrzymanej potęgi dwójki. 12
Wyznaczanie wartości dziesiętnej liczb w notacji uzupełnieniowej Zauważmy, że jeżeli pierwszy bit od lewej jest równy 0, to mamy reprezentacje liczby dodatniej, w pozostałych przypadkach zawsze będzie to liczba ujemna. Przykład. Wyznaczyć wartość dziesiętną liczby 01011101uz -2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 0 1 0 1 1 1 0 1 01011101 uz = 0* 2 8-1 + 1*2 6 + 1*2 4 + 1*2 3 + 1*2 2 + 1= = 0 + (64+16+8+4+1) = 93 (liczba 8 bitowa) Ćw 7. Podać wartość dziesiętną liczby x uz =10011001 13
Algorytm Hornera dla reprezentacji uzupełnieniowej 14 Algorytm Hornera dla reprezentacji uzupełnieniowej (zamiana na wartość dziesiętną) Ponieważ z definicji wynika, że x = c n 1 2 n 1 +(c n-2 2 n-2 +...+ c 1 2 1 +c 0 ) zatem przed najstarszą cyfrą c n-1 stawiamy znak minus i postępujemy tak jak poprzednio w algorytmie Hornera: b n-1 = - c n-1 b k = b k+1.p + c k, (k = n-2,...,0)
Algorytm Hornera dla reprezentacji uzupełnieniowej 15 Przykład. Zapisać w postaci dziesiętnej liczbę 10111110 zapisaną w reprezentacji uzupełnieniowej korzystając z algorytmu Hornera. c 7 c 6 c 5 c 4 c 3 c 2 c1 c 0 1 0 1 1 1 1 1 0 p=2-1 -2-3 -5-9 -17-33 -66 Zatem ( 10111110) u2 =-66.
Schematy blokowe 16 Algorytm skończony ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań. Sposób postępowania prowadzący do rozwiązania problemu. Schematy blokowe są tzw. metajęzykiem. Oznacza to, że jest to język bardzo ogólny, służy do opisywania algorytmów w taki sposób, by na jego podstawie można było je zaimplementować w każdym języku. Częściami składowymi schematów blokowych są proste figury geometryczne, np. prostokąt, romb, koło, równoległobok itd... W tych figurach umieszczamy warunki oraz proste instrukcje, na przykład:
Schematy blokowe 17 przypisania(podstawienia) = porównania x == y (czy x jest równe y) x!= y (czy x jest różne od y) x > y (czy x jest większe od y) <, >=, <= instrukcje zawierające działania arytmetyczne: +, -, *, / (dla liczb całkowitych dzielenie / oznacza dzielenie całkowite, % oznacza resztę z dzielenia) wyrażenia zawierające operatory logiczne && (logiczne AND) oraz (logiczne OR)
Schematy blokowe 18 Poszczególne elementy schematu łączy się za pomocą strzałek. W większości przypadków blok ma jedną strzałkę wchodzącą i jedną wychodzącą, lecz są także wyjątki. Ta figura oznacza początek lub koniec algorytmu. W każdym algorytmie musi się znaleźć dokładnie jedna taka figura z napisem "Start" oznaczająca początek algorytmu oraz dokładnie jedna figura z napisem "Stop" lub "End " oznaczająca koniec algorytmu. Najczęściej popełnianym błędem w schematach blokowych jest umieszczanie kilku stanów końcowych, zależnych od sposobu zakończenia programu. Blok symbolizujący początek algorytmu ma dokładnie jedną strzałkę wychodzącą a blok symbolizujący koniec ma co najmniej jedną strzałkę wchodzącą.
Schematy blokowe 19 Jest to figura oznaczająca proces. W jej obrębie umieszczamy wszelkie obliczenia lub podstawienia. Proces ma dokładnie jedną strzałkę wchodzącą i dokładnie jedną strzałkę wychodzącą Romb symbolizuje blok decyzyjny. Umieszcza się w nim jakiś warunek (np. x>2). Z dwóch wybranych wierzchołków rombu wyprowadzamy dwie możliwe drogi: gdy warunek jest spełniony (strzałkę wychodzącą z tego wierzchołka należy opatrzyć etykietą "Tak" lub "true") oraz gdy warunek nie jest spełniony ("Nie" lub "false"). Każdy romb ma dokładnie jedną strzałkę wchodzącą oraz dokładnie dwie strzałki wychodzące.
Schematy blokowe 20 Prostokąt stosowany do wczytania danych. Figura ta ma dokładnie jedną strzałkę wchodzącą i jedną wychodzącą Prostokąt stosowany do wyświetlenia danych. Figura ta ma dokładnie jedną strzałkę wchodzącą i jedną wychodzącą. Ta figura symbolizuje proces, który został już kiedyś zdefiniowany. Można ją porównać do procedury, którą definiuje się raz w programie, by następnie móc ją wielokrotnie wywoływać. Warunkiem użycia jest więc wcześniejsze zdefiniowanie procesu. Podobnie jak w przypadku zwykłego procesu i tu mamy jedno wejście i jedno wyjście.
Schematy blokowe 21 Koło symbolizuje tzw. łącznik stronicowy. Może się zdarzyć, że chcemy "przeskoczyć" z jednego miejsca na kartce na inne (np. by nie krzyżować strzałek). Możemy w takim wypadku posłużyć się łącznikiem. Umieszczamy w jednym miejscu łącznik z określonym symbolem w środku (np. cyfrą, literą) i doprowadzamy do nie go strzałkę. Następnie w innym miejscu kartki umieszczamy drugi łącznik z takim samym symbolem w środku i wyprowadzamy z niego strzałkę. Łącznik jest często porównywany do przeskoku (z jednego miejsca na kartce do drugiego). Łączniki występują więc w parach, jeden ma tylko wejście a drugi wyjście.
Schematy blokowe 22 Istnieje wiele odmian, drobnych różnic w schematach blokowych. Np. operacje wejścia/wyjścia często są reprezentowane przez równoległobok. Inną formą zapisu algorytmów są schematy N-S (Schematy Nassi Schneidermana)
Przykład sprawdzenie czy x>y 23 Narysu schemat blokowy algorytmu, który pobiera od użytkownika dwie liczby a następnie sprawdza która z nich jest większa.