ARYTMETYKA BINARNA
Transkrypt
ARYTMETYKA BINARNA
ARYTMETYKA BINARNA ROZWINIĘCIE DWÓJKOWE Jednym z najlepiej znanych sposobów kodowania informacji zawartej w liczbach jest kodowanie w dziesiątkowym systemie pozycyjnym, w którym dla przedstawienia liczb naturalnych używamy dziesięciu różnych znaków – cyfr : 0,1...,9, dla przedstawienia dowolnych liczb całkowitych – jedenastu różnych znaków: cyfr oraz znaku “minus”, a dla przedstawienia liczb wymiernych – dwunastu znaków: cyfr, znaku “minus” i znaku kropki albo przecinka oddzielającego część całkowitą od części ułamkowej. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia. Ze względu na przystosowanie urządzeń informatyki do pracy z dwójkowymi ciągami kodowymi, w elektronicznych systemach liczących przedstawiamy liczby (jak i pozostałe wiadomości) w kodzie dwójkowym. W zasadzie stosuje się dwa sposoby kodowania – tzw. dwójkowe kodowanie cyfr dziesiątkowych, przy którym ciągi kodowe są przypisane poszczególnym cyfrom dziesiątkowego rozwinięcia pozycyjnego (tzw. kod BCD, ang. Binary Coded Decimals) oraz dwójkowy system pozycyjny tj. przedstawienie liczb w systemie pozycyjnym o podstawie dwa. W dwójkowym systemie pozycyjnym do zapisu liczb naturalnych używamy dwu różnych znaków: cyfr dwójkowych 0 i 1. Cyfry dwójkowe nazywamy także binarnymi (ang. binary digit – dwójkowa cyfra). Naturalny kod binarny (NB) można określić wzorem: Sposób określenia słowa A w kodzie NB, gdy jest dane słowo reprezentujące liczbę nieujemną w powszechnie stosowanym kodzie dziesiętnym, wynika z wyżej podanego wzoru i jest następujący: » gdy dana liczba jest całkowita, to kolejne bity słowa A, począwszy od bitu a0 aż do bitu an-1, są kolejnymi resztami z dzielenia tej liczby, lub otrzymanego w poprzednim kroku ilorazu przez 2; » gdy dana liczba jest ułamkowa, to kolejne bity słowa A, od bitu a-1 aż do bitu a -m., są kolejnymi częściami całkowitymi iloczynu tej liczby, lub otrzymanej w poprzednim kroku części ułamkowej, przez 2; 1 » gdy dana liczba zawiera część całkowitą i część ułamkową, to dla każdej z nich określamy odrębnie bity słowa A PRZYKŁAD: L(A)10=23,625 L(A)2 =? 23=11*2+1 a0 0,625 11= 5*2+1 a1 *2 5= 2*2+1 a2 2= 1*2+0 a3 1= 0*2+1 a4 0= 0*2+0 a5 . *2 a -2 (0),500 *2 a -3 . (1),000 *2 . 0 (1),250 a -1 a -4 an-2 (0),000 . . . a -m 0 L(A)2 = 0...010111,1010...0 Istnieją dwa sposoby zapisu liczb: • system pozycyjny, w którym każda cyfra może przybierać różne wartości w zależności od jej położenia w liczbie , 2 • system nie pozycyjny, w którym wartość cyfr nie zależy od jej miejsca w liczbie. W systemie pozycyjnym odpowiednim położeniom cyfry w liczbie są przyporządkowane odpowiednie “wagi” stanowiące o wartości nominalnej cyfry w liczbie. “Wagi” te, to kolejne naturalne potęgi dowolnej liczy. Od tej liczby najczęściej pochodzi nazwa i tak, jeżeli jest to 2 to system nazywamy dwójkowym, jeżeli 5 to piątkowym. Wagi te stanowią o podstawie liczenia systemu zapisu liczb. REGUŁA ZAMIANY » Aby zamienić liczbę przedstawioną w systemie liczenia o podstawie “p” na liczbę przedstawioną w systemie liczenia o podstawie “c”, gdzie q = pn, n ∈ N grupujemy na lewo i prawo od przecinka cyfry liczby o podstawie liczenia “p” (po n w grupie) i każdą z tych grup zapisujemy w systemie liczenia o podstawie “q”. » Aby zamienić liczbę przedstawioną w systemie liczenia o podstawie “p” na liczbę przedstawioną w systemie liczenia o podstawie “q”, gdzie p = qn, n ∈ N każdą z cyfr w systemie liczenia o podstawie “p” zapisujemy jako n – cyfrową liczbę w systemie liczenia o podstawie “q”. » Aby przedstawić liczbę całkowitą przedstawioną w systemie o podstawie liczenia “p” na liczbę przedstawioną w systemie liczenia o podstawie “q” dokonujemy dzielenia tej liczby przez “q” zapisanej w systemie o podstawie “p” aż do otrzymania reszty mniejszej od “q”. Otrzymane reszty częściowe zamienia się na system o podstawie “q”, natomiast dzielenie wykonuje się w systemie o podstawie “p”. » Dla liczb ułamkowych algorytm ten jest podobny z tym, że zamiast dzielenia dokonujemy mnożenia. Kolejno otrzymane cyfry części całkowitej są cyframi nowej liczby w systemie liczenia o podstawie “q”. Czynność mnożenia jest wykonywana tak długo aż wyzerujemy część ułamkową. W innym przypadku uzyskujemy tak zwany k – ty redukt rozwinięcia tego ułamka (gdzie k jest dokładnością dokonywanych obliczeń). PRZYKŁAD: 1. L(A)10 = 247 L(A)5 = ? 247 / 52 49 / 54 9/5 4 11 3 L(A)5 = (1442)5 = 1 * 53+4 * 52 + 4 * 51 + 2 * 50 2. L(A)10 = 0,0325 L(A)4 = ? 0,0325 * 40 0,13 * 4 0 0,52 * 42 2,08 * 40 0,32 * 41 1,28 * 41 1,12 L(A)4 = (0.002011)4 – 6-ty redukt rozwinięcia Kod znak –moduł – ZM Dla liczb dwójkowych q= 2 Kod uzupełnienia do 1 – ZU1 Spełnia się zależność jeżeli an-1 = 0, to L(A) Wynika stąd, że kod ZU1 jest kombinacją kodów. Liczby nieujemne są reprezentowane w naturalnym kodzie binarnym notacji dodatniej, a liczby niedodatnie – w dualnym kodzie naturalnym binarnym notacji dodatniej. 4 Kod uzupełnienia do 2 – ZU2 Kod zu2 notacji ujemnej jest zadany wzorem: » Aby zapisać liczbę w kodzie ZU1 należy liczbę w kodzie ZM zanegować na wszystkich pozycjach, za wyjątkiem pozycji an-1( bit znakowy). » Aby otrzymać liczbę w kodzie ZU2 należy zapisać ją w kodzie ZM, a następnie licząc od końca wszystkie cyfry przepisać zamieniając je na przeciwne, za wyjątkiem pierwszej jedynki. Cyfra znaku pozostaje bez zmian. » Liczba dodatnia ma jednakową postać we wszystkich zapisać. L(A)2 = 0...010111,1010...0 Istnieją dwa sposoby zapisu liczb: • • system pozycyjny, w którym każda cyfra może przybierać różne wartości w zależności od jej położenia w liczbie, system nie pozycyjny, w którym wartość cyfr nie zależy od jej miejsca w liczbie. W systemie pozycyjnym odpowiednim położeniom cyfry w liczbie są przyporządkowane odpowiednie “wagi” stanowiące o wartości nominalnej cyfry w liczbie. “Wagi” te, to kolejne naturalne potęgi dowolnej liczy. Od tej liczby najczęściej pochodzi nazwa i tak, jeżeli jest to 2 to system nazywamy dwójkowym, jeżeli 5 to piątkowym. Wagi te stanowią o podstawie liczenia systemu zapisu liczb. 5 DZIAŁANIA NA ZM, ZU1, ZU2 LICZBACH ZAPISANYCH W KODACH BINARNYCH: Operacje dodawania i odejmowania w kodzie Znak – Moduł ZM odbywają się według poniższej tabeli: Operacja an-1 bn-1 Operacja wykonywana Znak sumy Jednakowe Dodawanie Różne Jednakowe Odejmowanie Różne Uwaga: gdy w = 1, wówczas Z* ma postać ZU2 A*, B* – cyfry liczby; zn-1, an-1, bn-1 – znak liczby (1 cyfra) w - pożyczka » W przypadku kodu ZU1 dodajemy i odejmujemy cyfry liczb wraz ze znakiem. Jeżeli występuje przepełnienie lub pożyczka to uwzględniamy ją poprzez dodanie lub odjęcie od najmniej znaczącej pozycji. » W przypadku kodu ZU2 nie uwzględniamy przepełnienia czy pożyczki, a operacje są wykonywane również na znaku. Przy wykonywaniu działań dodawania i odejmowania w ZU1 i ZU2 musimy zawsze uwzględniać to, na ilu pozycjach musi być zapisany wynik. Trzeba o tym pamiętać ze względu na to aby przepełnienie nie nastąpiło przy dodawaniu bitów znaku. Dlatego liczby przed operacją dodawania lub odejmowania zapisujemy na k+1 pozycjach, gdzie k jest liczą pozycji dla składnika o większym module. 6 PRZYKŁAD: - L(A)ZM= 0.0000111 - L(B)ZM =1.000101 - L(B)ZU1= 1.111010 - L(B)ZU2= 1.111011 Dodawanie A+B w kodzie Znak - Moduł ZM Dodajemy 0 na k + 1 -ej pozycji oraz liczbę B uzupełniamy cyfrą 0, aby obie miały identyczną ilość pozycji; wykonujemy operację odejmowania, gdyż są różne bity znakowe Znak wyniku zn-1 = , bo w = 1, czyli zn-1 = 1 Wynik dodawania jest w ZU2 (bo w=1): (1.1,1111101)ZU2 = (1.0,0000011)ZM (1.1,1111101)ZU2 =(1.0,0000011)ZM= Dodawanie A+B w kodzie ZU1 Dodajemy 0 dla A i 1 dla B na k+1–ej pozycji oraz uzupełniamy cyfrą 1, aby obie liczby miały tę samą ilość pozycji; dodajemy liczby wraz z bitem znakowym. 7 Wynik jest w kodzie ZU1 (1.1,1111100)ZU1 = (1.0,0000011)ZM = Dodawanie A+B w kodzie ZU2 Dodajemy 0 dla A i 1 dla B na k+1–ej pozycji i liczbę B uzupełniamy cyfrą 0, aby obie liczby miały tę samą ilość pozycji; dodajemy wraz z bitem znakowym. Wynik jest w kodzie ZU2 (1.1,1111101)ZU2 = (1.0,0000011)ZM = PRZESUWANIE LICZB BINARNYCH PRZESUWANIE LICZB ZE ZNAKIEM Przesuwanie liczb jest jednoznaczne z mnożeniem danej liczby przez 2i (gdy przesuwamy liczbę mnożoną przez 2i w lewo o " i" pozycji) i dzieleniem, czy też mnożeniem przez 2-i (gdy przesuwamy liczbę mnożoną przez 2-i w prawo o "i" pozycji.) PRZESUWANIE LICZB Liczba dodatnia i ujemna w kodzie ZM ZNAK BEZ ZMIAN Liczba ujemna w postaci kodu ZU1 ZNAK BEZ ZMIAN Liczba ujemna w postaci kodu ZU2 -------------------- PRZY PRZESUNIĘCIU WSZYSTKIE DODANE CYFRY SĄ ZERAMI PRZY PRZESUNIĘCIU WSZYSTKIE CYFRY DODANE SĄ JEDYNKAMI PRZY PRZESUNIĘCIU W LEWO DODAJEMY ZERA PRZY PRZESUNIĘCIU W PRAWO DODAJEMY JEDYNKI 8 PRZYKŁAD: L(A) = (-6)10 Kod Znak - Moduł ZM 1.0110 * 21 = 1.1100 = -12 1.0110 * 2-1 = 1.0011 = -3 Kod ZU1 1.1001 * 21 = 1.0011 = -12 1.1001 * 2-1 = 1.1100 = -3 Kod ZU2 1.1010 * 21= 1.0100 = -24 + 22 = -16 + 4 = -12 1.1010 * 2-1= 1.1101 = -24 + 23 + 22 + 20= -16 + 13 = -3 METODY MNOŻENIA LICZB W SYSTEMIE DWÓJKOWYM Mnożenie można przeprowadzić wykorzystując następujące metody: 1. 2. 3. 4. 5. metoda mnożenia bezpośredniego, metoda Burksa – Goldsteine’a – von Neumanna, I metoda Robertsona, II metoda Robertsona, metoda Bootha. METODA MNOŻENIA BEZPOŚREDNIEGO Jest stosowana do liczb zapisanych w kodzie ZM. Mnożenie w tej metodzie przebiega tak jak mnożenie pisemne liczb dziesiętnych, zatem jest ono zastąpione wielokrotnym dodawaniem odpowiednio przesuniętej mnożnej. MNOŻENIE METODĄ BOOTH’A » I wariant metody Booth’a Porównywanie par bitów mnożnika (w ZU2). Badamy ostatnie pary bitów (cyfr) mnożnika. 1. Jeżeli badana para jest kombinacją 1 0, to od iloczynu częściowego odejmujemy mnożną L(A) i przesuwamy wynik o jedno miejsce w prawo (*2-1). 9 2. Jeżeli badana para jest odpowiednio parą 0 1, to dodajemy mnożną do iloczynu częściowego i przesuwamy cały wynik o jedno miejsce w prawo. 3. Jeżeli badana para jest parą o jednakowych cyfrach 0 0 lub 1 1, to wykonujemy tylko przesunięcie w prawo. 4. Jeżeli w skład wchodzi bit znakowy (znak), to nie wykonujemy przesunięcia. PRZYKŁAD: Dla I wariantu metody Booth’a L(A) = = (0.00111)ZM L(B)= = (1.00001)ZM = (1.11111)ZU2 Do liczby B na najmniej znaczącej pozycji dopisujemy 0, zatem: L(B) = (1.111110)ZU2 Badamy kolejne bity mnożnika (czyli kolejne bity liczby B): I. II. III. IV. V. para 1–0 - od iloczynu częściowego odejmujemy mnożną (iloczyn częściowy wynosi na początku 0), następnie przesuwamy wynik o jedno miejsce w prawo, para 1–1 - przesuwamy iloczyn częściowy o jedno miejsce w prawo, para 1–1 - przesuwamy iloczyn częściowy o jedno miejsce w prawo, para 1–1 - przesuwamy iloczyn częściowy o jedno miejsce w prawo, para 1–1 - przesuwamy iloczyn częściowy o jedno miejsce w prawo. Wynik: (1.1111111001)ZU2 = (1.0000000111)ZM = » II wariant metody Booth’a: 10 1. Przesuwamy mnożną o jedno miejsce w prawo (uzyskujemy A/2 – “A – pół”). 2. Zbadamy ostatni bit mnożnika, jeżeli jest on równy 1, to dodajemy mnożną do iloczynu częściowego, który jest równy zeru na początku mnożenia, jeżeli ostatni bit mnożnika jest równy 0, to nie wykonujemy żadnego działania. 3. Przesuwamy iloczyn częściowy o jedno miejsce w prawo. 4. Przesuwamy mnożnik o jedno miejsce w prawo ( przejście do kolejnego badania bitu mnożnika). Jeżeli badany bit jest bitem znakowym b0, to wtedy gdy jego wartość wynosi 1 odejmujemy mnożną od iloczynu częściowego, zaś gdy jest on równy 0 nie wykonujemy żadnego działania. 5. Uzyskany iloczyn częściowy przesuwamy o jedno miejsce w lewo (powrót do A), wynik jest w postaci ZU2. PRZYKŁAD: Dla II wariantu metody Booth’a L(A) = = (0.11011)ZM L(B) = = (1.10101)ZM = (1.01010)ZU1 = (1.01011)ZU2 Przesuwamy mnożną o jedno miejsce w prawo – uzyskanie wartości “A – pół”: Badamy kolejne bity mnożnika począwszy od ostatniego: I. II. III. IV. V. VI. VII. bit = 1 – dodajemy mnożną (“A–pół”) do iloczynu częściowego (na początku równego 0), a następnie przesuwamy otrzymany iloczyn częściowy o jedno miejsce w prawo, bit = 1 – dodajemy mnożną do iloczynu częściowego, przesuwamy otrzymany iloczyn częściowy o jedno miejsce w prawo, bit = 0 – nie wykonujemy żadnej operacji, przesuwamy iloczyn częściowy o jedno miejsce w prawo, bit = 1 – dodajemy mnożną do iloczynu częściowego, przesuwamy otrzymany iloczyn częściowy o jedno miejsce w prawo, bit = 0 – nie wykonujemy żadnej operacji, przesuwamy iloczyn częściowy o jedno miejsce w prawo, bit =1 – badany bit jest bitem znakowym i jest równy 1 dlatego wystąpi tzw. poprawka – odejmujemy mnożną od iloczynu częściowego, . otrzymany wynik przesuwamy o jedno miejsce w lewo. 11 Wynik: (1.0111001001)ZU2 = (1.1000110111)ZM = Uwaga: Mnożymy tylko ułamki! Jeżeli chcemy pomnożyć ułamki niewłaściwe to zapisujemy je w postaci mantysy i cechy i wykonujemy mnożenie mantys i mnożenie cech, ostateczny wynik to mantysa * cecha. METODY DZIELENIA LICZB W SYSTEMIE DWÓJKOWYM DZIELENIE LICZB BINARNYCH Dzielenie można przeprowadzić wykorzystując następujące metody: 1. metoda porównawcza, 2. metoda restytucyjna, 3. metoda nierestytucyjna, METODA PORÓWNAWCZA – jest stosowana w zapisie znak moduł (ZM) i gdy jest spełniony warunek A<B, gdzie: 12 A – dzielna B – dzielnik r0 – reszta początkowa Rn – reszta z dzielenia rn – n – ta reszta częściowa Q – iloraz uzyskany w algorytmie o bitach qi. Metoda ta polega na porównywaniu dzielnika z n – tą resztą. » Jeżeli dzielnik jest mniejszy od rn-tej reszty rn=>B, to odejmujemy dzielnik od przesuniętej n – tej reszty, a bit ilorazu qi = 1. » Jeżeli n – ta reszta jest mniejsza od dzielnika rn<B, to kolejny bit ilorazu qi = 0. Następnie przesuwamy wynik o jedno miejsce w lewo. Otrzymaną resztę częściową porównujemy z dzielnikiem. Uwaga: Wynikiem dzielenia jest iloraz Q o bitach q0q1..qi.W pierwszym kroku porównujemy resztę początkową r0 z dzielnikiem, gdzie r0 – to L(A) zapisana na tylu pozycjach co L(B). PRZYKŁAD: Dla metody porównawczej A= B = = (1.0000011)ZM = (0.1001)ZM Warunek A<B jest spełniony; porównujemy kolejne reszty częściowe z modułem dzielnika: 13 reszta z dzielenia Rn wyraża się wzorem: Rn = Rn = 0.011 * 101.110 Bit znaku q0 = a0 ⊕ b0, czyli q0 = 1, bo a0 = 1, b0 = 0 Ostateczny iloraz Q wynosi: Q = q0 q1 q2...qn Q = 1.00001 METODA RESTYTUCYJNA – to metoda dzielenia dwóch liczb zapisanych w kodzie znak moduł (ZM) i gdy |A|<|B|. Algorytm metody restytucyjnej różni się od metody porównawczej tym, że zawsze następuje odejmowanie dzielnika od i – tej reszty. Jeżeli otrzymana reszta jest większa od zera, to 14 kolejny bit ilorazu jest równy 1, jeżeli jest mniejsza od zera, to kolejny bit ilorazu jest równy 0. Bez względu na znak reszty z odejmowania przesuwamy resztę o jedno miejsce w lewo. Dla reszty ujemnej z powrotem dodajemy dzielnik, zanim przesuniemy wynik w lewo. METODA NIERASTYTUCYJNA – to metoda dla dzielenia dwóch liczb zapisanych w kodzie ZU2. Dzielna A i dzielnik B są ułamkami w postaci znormalizowanej oraz wymagane jest by był spełniony warunek |A|<|B|. Metoda ta polega na badaniu znaku dzielnika i kolejnej reszty częściowej. Jeżeli znaki są zgodne to odejmujemy dzielnik od przesuniętej w lewo kolejnej reszty częściowej. Jeżeli znaki ich są różne to dodajemy dzielnik do przesuniętej w lewo kolejnej reszty częściowej. Przy zgodnych bitach znakowych dzielnika i reszty bit ilorazu jest jedynką, a dla znaków przeciwnych jest zerem. Do otrzymanego wyniku dodajemy poprawkę równą: -1+2-n, gdzie n – oznacza n – tą resztę z dzielenia. PRZYKŁAD: Dla metody nierestytucyjnej Warunek lAl < lBl jest spełniony: Wynik: 0.101; 15 Do wyniku dodajemy poprawkę, która wynosi: -1 + 2-n, gdzie n jest to nr ostatniej reszty dzielenia, zatem: -1 + 2-n = (1.0001)ZU2 Wynik końcowy: (1.1011)ZU2=(1.0101)ZM 16