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

Podobne dokumenty