MNOŻENIE W SYSTEMACH UZUPEŁNIENIOWYCH PEŁNYCH (algorytm uniwersalny) SPOSÓB 1 (z rozszerzeniem mnożnika): Algorytm jak zwykle jest prosty: lewostronne rozszerzenie mnożnej o kilka cyfr (na pewno wystarczy gdy rozszerzymy o ilość cyfr mnożnika), lewostronne rozszerzenie mnożnika o jedną cyfrę, wykonywanie normalnego mnożenia (jakby to był system naturalny ale z uwzględnieniem nieskończonego rozszerzenia największą bądź najmniejszą cyfrą w danym systemie) na wszystkich cyfrach mnożnika poza cyfrą rozszerzenia, jeśli cyfrą rozszerzenia jest -1 (największa cyfra w danym systemie) to powinniśmy dodać również uzupełnienie MNOŻNEJ przesunięte o ilość cyfr mnożnika (nie licząc cyfry rozszerzenia), jeśli jest 0, nic więcej nie robimy PRZYKŁAD 1.1: 0 3 2 5 5 uzupełnienie mnożnej 9 9 9 9 6 7 4 5 U10 mnożna 9 8 1 2 3 U10 mnożnik 9 9 9 9 9 9 0 2 3 5 9 9 9 9 9 3 4 9 0 9 9 9 9 6 7 4 5 9 9 7 3 9 6 0 0 0 3 2 5 5 dodajemy uzupełnienie 0 0 0 6 1 0 9 6 3 5 U10 6745 U10 8123 U10 = 06109635 U10 PRZYKŁAD 1.2: 7 7 7 7 7 7 4 5 0 0 7 2 3 7 7 7 7 7 7 7 6 5 7 7 7 7 7 7 7 7 1 2 7 7 7 7 7 5 0 3 7 7 7 7 7 4 7 2 7 7 7745 U8 0723 U8 = 747277 U8 PRZYKŁAD 1.2: 7 4 6 2 2 0 0 0 0 3 1 5 6 7 6 4 2 3 0 0 0 0 0 1 1 5 1 2 0 0 0 0 0 6 3 3 4 0 0 0 1 4 6 7 0 0 0 2 3 2 2 4 7 7 4 6 2 2 7 7 7 3 2 3 0 0 5 2 3156 U8 6423 U8 = 73230052 U8 1
SPOSÓB 2 (bez rozszerzania mnożnika): Algorytm jak zwykle jest prosty: lewostronne rozszerzenie mnożnej o kilka cyfr (na pewno wystarczy gdy rozszerzymy o ilość cyfr mnożnika), wykonywanie normalnego mnożenia (jakby to był system naturalny ale z uwzględnieniem nieskończonego rozszerzenia największą bądź najmniejszą cyfrą w danym systemie) na wszystkich cyfrach poza ostatnią, dodajemy mnożną pomnożoną przez wartość (wartość może być ujemna bądź dodatnia, np w U10 wartość cyfry 7 to -3) ostatniej (najstarszej) cyfry mnożnika, przesunięte o jeden mniej niż ilość cyfr mnożnika PRZYKŁAD 2.1: 0 3 2 5 5 uzupełnienie mnożnej 9 9 9 9 6 7 4 5 U10 mnożna 8 1 2 3 U10 mnożnik 9 9 9 9 9 9 0 2 3 5 9 9 9 9 9 3 4 9 0 9 9 9 9 6 7 4 5 0 0 0 6 5 1 0 8 U10=-2 10 więc dodajemy -2*mnożną czyli 2*uzupełnienie mnożnej 0 0 0 6 1 0 9 6 3 5 U10 6745 U10 8123 U10 = 06109635 U10 PRZYKŁAD 2.2 (tu nic się nie zmienia!): 7 7 7 7 7 7 4 5 0 7 2 3 7 7 7 7 7 7 7 6 5 7 7 7 7 7 7 7 7 1 2 7 7 7 7 7 5 0 3 7 7 7 7 7 4 7 2 7 7 7745 U8 0723 U8 = 747277 U8 PRZYKŁAD 2.3 (6 U8= -(8-6)= -2): 7 4 6 2 2 0 0 0 0 3 1 5 6 6 4 2 3 0 0 0 0 0 1 1 5 1 2 0 0 0 0 0 6 3 3 4 0 0 0 1 4 6 7 0 7 7 7 1 4 4 4 7 7 7 3 2 3 0 0 5 2 3156 U8 6423 U8 = 73230052 U8 2
MNOŻENIE W SYSTEMIE U2 1101011 U2 1000110 U2 = 1 010101 2 1 0111010 2 =21 10 58 10 =1218 10 =10011000010 2 =010011000010 U2 SPOSÓB 1: skanujemy mnożnik od prawej strony aż do przedostatniej cyfry i jeśli cyfrą jest zero to dodajemy 0 (czyli w zasadzie nic nie dodajemy) a jeśli cyfrą jest 1 to dodajemy mnożną, każdą kolejną liczbę zapisujemy przesuniętą o jedną pozycję w lewo w stosunku do liczby poprzedniej (jak w normalnym mnożeniu), jeśli ostatnią cyfrą mnożnika jest 1 to zamiast dodawać na tym przesunięciu mnożną, dodajemy uzupełnienie (jeśli jest 0 to nic nie dodajemy), przed dodaniem liczb zapisujemy po lewej stronie ich rozszerzenie (jedynki dla liczb z 1 na najstarszym bicie i zera dla liczb z 0 na najstarszym bicie). UWAGA: Jeśli mnożna ma mniej bitów niż mnożnik a jest liczbą ujemną (jego najstarszym bitem jest 1), należy rozszerzyć go jedynkami z lewej strony aż do długości mnożnej. Ma to znaczenie ponieważ TYLKO najstarszy bit odpowiada za dodanie uzupełnienia zamiast mnożnej. Oto przykład (rozszerzenie zapisane jest na szarym tle, podkreśloną kursywą) 0 0 1 0 1 0 1 uzupełnienie mnożnej 1 1 0 1 0 1 1 mnożna 1 0 0 0 1 1 0 mnożnik (0) 0 0 0 0 0 0 0 0 0 0 0 0 0 mnożna razy 0 czyli 0 (1) 1 1 1 1 1 1 1 0 1 0 1 1 mnożna przesunięta o 1 pozycję (1) 1 1 1 1 1 1 0 1 0 1 1 mnożna przesunięta o 2 pozycje (0) 0 0 0 0 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięta o 3 pozycje (0) 0 0 0 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięta o 4 pozycje (0) 0 0 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięte o 5 pozycji (0) 0 0 1 0 1 0 1 uzupełnienie mnożnej przesunięte o 6 pozycji (0) 0 0 1 0 0 1 1 0 0 0 0 1 0 suma 3
SPOSÓB 2: Postępujemy podobnie jak w poprzednim przypadku: skanujemy mnożnik od prawej aż do przedostatniej cyfry, jeśli cyfrą jest 0 to dodajemy 0 (mające tyle cyfr co mnożna) z zanegowanym najstarszym bitem, jeśli 1 to dodajemy mnożną z zanegowanym najstarszym bitem, w mnożeniu przez ostatnią cyfrę dodajemy negację mnożnej z zanegowanym ostatnim bitem jeśli to cyfra 1, jeśli nie, to dodajemy zero z jedynka na najstarszym bicie jako ostatnią dodajemy korektę w postaci liczby składającej się z cyfry jeden na pozycji takiej jak najstarszy bit mnożnej i z cyfry 1 na pozycji o jeden dalszej niż cyfra zanegowana w po poprzednim mnożeniu, dzięki negacji pierwszych cyfr NIE UWZGLĘDNIAMY ROZSZERZENIA PRZY DODAWANIU. 0 0 1 0 1 0 1 uzupełnienie mnożnej 1 1 0 1 0 1 1 mnożna 1 0 0 0 1 1 0 mnożnik 1 0 0 0 0 0 0 mnożna razy 0 czyli 0 0 1 0 1 0 1 1 mnożna przesunięta o 1 pozycję 0 1 0 1 0 1 1 mnożna przesunięta o 2 pozycje 1 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięta o 3 pozycje 1 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięta o 4 pozycje 1 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięta o 5 pozycji 1 0 1 0 1 0 1 uzupełnienie mnożnej przesunięte o 6 pozycji (1) 1 0 0 0 0 0 0 1 korekta przesunięta o ilość cyfr mnożnej-1 (0) 0 0 0 1 0 0 1 1 0 0 0 0 1 0 suma Oto przykład (zanegowane najstarsze bity zostały pogrubione): 4
SPOSÓB 3.1: Z zamianą na SD algorytmem Booth'a Algorytm mnożenia z zamianą na SD: zamieniamy MNOŻNIK z systemu U2 na SD, zapisujemy sobie uzupełnienie mnożnej, zaczynamy od prawej strony liczby SD i skanujemy kolejne cyfry, jeśli cyfrą jest zero to dodajemy 0 (lub po prostu nic nie dodajemy), jeśli -1 to dodajemy uzupełnienie mnożnej a jeśli 1 to dodajemy mnożną, każdą kolejną dodawaną liczbę zapisujemy z przesunięciem o jeden większym niż poprzednią (jak w każdym mnożeniu). Algorytm zmiany liczby U2 na SD: zaczynamy od prawej strony i obliczamy kolejne cyfry po jednej, rozszerzamy liczbę dopisując cyfrę 0 po prawej stronie, żeby otrzymać cyfrę w kodzie SD na pozycji i, odejmujemy od cyfry w U2 na pozycji i-1, cyfrę na pozycji i, jeśli nie skończyliśmy, obliczamy kolejną cyfrę, Dodawane liczby są w systemie U2 więc przed ich dodaniem rozszerzamy je po lewej stronie. Przykład: x 6 x 5 x 4 x 3 x 2 x 1 x 0 x -1 oznaczenia pozycji 1 0 0 0 1 1 0 mnożnik w U2 1 0 0 0 1 1 0 0 uzupełniamy mnożnik cyfrą 0 z prawej strony x 5-x 6 x 4-x 5 x 3-x 4 x 2-x 3 x 1-x 2 x 0-x 1 x -1-x 0 wzory na otrzymanie kolejnych cyfr 0-1 0-0 0-0 1-0 1-1 0-1 0-0 wartości podstawione do wzorów -1 0 0 1 0-1 0 mnożnik w SD 0 0 1 0 1 0 1 uzupełnienie mnożnej 1 1 0 1 0 1 1 mnożna 1 0 0 0 1 1 0 mnożnik -1 0 0 1 0-1 0 mnożnik w systemie SD (0) 0 0 0 0 0 0 0 0 0 0 0 0 0 mnożna razy 0 czyli 0 (0) 0 0 0 0 0 0 0 1 0 1 0 1 uzupełnienie mnożnej przesunięte o 1 pozycję (0) 0 0 0 0 0 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięte o 2 pozycje (1) 1 1 1 1 1 0 1 0 1 1 mnożna przesunięta o 3 pozycje (0) 0 0 0 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięte o 4 pozycje (0) 0 0 0 0 0 0 0 0 mnożna razy 0 czyli 0, przesunięte o 5 pozycji (0) 0 0 1 0 1 0 1 uzupełnienie mnożnej przesunięte o 6 pozycji (0) 0 0 1 0 0 1 1 0 0 0 0 1 0 suma 5
SPOSÓB 3.2: Z zamianą na SD rozszerzonym algorytmem Booth'a (inaczej algorytmem Booth'a McSorleya) Zmiana liczby U2 na SD wg algorytmu Booth'a-McSorleya: cyfry obliczamy od prawej, po dwie w każdej iteracji, dzielimy liczbę na grupy dwucyfrowe, liczbę rozszerzamy o cyfrę 0 z prawej strony (zawsze), w razie potrzeby liczbę należy rozszerzyć również lewostronnie o cyfry wynikające z jej znaku (0 dla liczb dodatnich, 1 dla ujemnych, drugą cyfrę każdej grupy mnożymy przez -2 i dodajemy dwie cyfry stojące na prawo od niej (pierwszą cyfrę grupy i drugą cyfrę poprzedniej grupy), wynik zapisujemy w formie dwucyfrowej liczby SD i algorytm powtarzamy dla kolejnych grup. Oto przykład (przekodujemy liczbę 1000110) x 7 x 6 x 5 x 4 x 3 x 2 x 1 x 0 x -1 oznaczenia pozycji 1 1 0 0 0 1 1 0 mnożnik w U2 1 1 0 0 0 1 1 0 0 uzupełniamy mnożnik cyframi rozszerzenia 1 1 0 0 0 1 1 0 0 dzielimy liczbę na grupy dwucyfrowe -2x 7 +x 6 +x 5-2x 5 +x 4 +x 3-2x 3 +x 2 +x 1-2x 1 +x 0 +x -1 wzory na otrzymanie kolejnych cyfr -2*1+1+0= -1-2*0+0+0= 0-2*0+1+1=2-2+ 0+ 0= -2 wartości podstawione do wzorów 0-1 0 0 1 0-1 0 mnożnik w SD Przekodowywanie liczb z U2 na SD wg alternatywnego algorytmu Booth'a McSorleya: Algorytm jest bardzo podobny do poprzedniego ale tym razem rozszerzamy po prawej o dwa zera i dzielimy na grupy do dwie cyfry zaczynając od pierwszego zera rozszerzenia. Dalej robimy już to samo co w poprzedniej metodzie. Najlepiej widać to po porównaniu przykładu powyższego z poniższym. UWAGA! Ta interpretacja różni się od tej prof. Biernata. On jest oczywiście autorytetem więc radzę używać jego sposobu a nie tego. x 7 x 6 x 5 x 4 x 3 x 2 x 1 x 0 x -1 x -2 oznaczenia pozycji 1 1 0 0 0 1 1 0 mnożnik w U2 1 1 0 0 0 1 1 0 0 0 uzupełniamy mnożnik cyframi rozszerzenia 1 1 0 0 0 1 1 0 0 0 dzielimy liczbę na grupy dwucyfrowe -2x 6 +x 5 +x 4-2x 4 +x 3 +x 2-2x 2 +x 1 +x 0-2x 0 +x -1 +x -2 wzory na otrzymanie kolejnych cyfr -2+0+0 = -2-2*0+0+1= 1-2+1+0= -1-2*0+0+0=0 wartości podstawione do wzorów 0-1 0 0 1 0-1 0 0 mnożnik w SD (interesują nas tylko cyfry od x o w lewo) UWAGA! Liczba w zapisie SD nie ma jednoznacznej postaci więc wyniki wyliczone różnymi algorytmami mogą się różnić co do zapisu (ale nie co do wartości). Algorytm Booth'a-McSorleya produkuje zawsze przynajmniej taką samą, a najczęściej większą, liczbę zer. Więcej zer to mniej liczenia :) Samo mnożenie wykonujemy tak samo jak w poprzednim przypadku. 6