Mnozenie i dzielenie liczb calkowitych
Transkrypt
Mnozenie i dzielenie liczb calkowitych
1011
1101
1011
0000
1011
1011
10001111
M (mnozna) 11
Q (mnoznik) 13
+
A (iloczyn) 143
Schemat mnożenia liczb dwójkowych (bez znaku)
Mnozna (M)
Shift left
2n-bitow
Mnoznik (Q)
Shift right
2n-bitowe
ALU
n-bitow
Iloczyn (A)
Write
Sterowanie
2n-bitow
M*Q = A
Układ mnożący (ver.1)
Start
A ¬0
1
Q[0]
Mnozna (M)
0
Shift left
2n-bitow
Mnoznik (Q)
Shift right
2n-bitowe
ALU
A¬M+A
n-bitow
Iloczyn (A)
Write
Sterowanie
M ¬ M << 1
2n-bitow
Q ¬ Q >> 1
M*Q = A
n-te
powtorzenie?
TAK
Stop
Algorytm mnożenia (ver.1)
Nie
Mnozna (M)
n-bitow
Mnoznik (Q)
Shift right
n-bitowe
ALU
n-bitow
Iloczyn (A)
Shift right
Write
Sterowanie
2n-bitow
M*Q = A
Układ mnożący (ver.2)
Start
A ¬0
1
Mnozna (M)
Q[0]
0
n-bitow
Mnoznik (Q)
Shift right
n-bitowe
ALU
A[2n-n] ¬ M + A[2n-n]
n-bitow
Iloczyn (A)
Shift right
Write
Sterowanie
A ¬ A >> 1
2n-bitow
Q ¬ Q >> 1
M*Q = A
n-te
powtorzenie?
TAK
Stop
Algorytm mnożenia (ver.2)
Nie
Mnozna (M)
n-bitow
n-bitowe
ALU
Shift right
Iloczyn A (Mnoznik 0|Q )
Write
2n-bitow
M*Q = A
Układ mnożący (ver.3)
Sterowanie
Start
A ¬0|Q
Mnozna (M)
1
A[0]
n-bitow
n-bitowe
ALU
0
A[2n-n] ¬ M + A[2n-n]
Shift right
Iloczyn A (Mnoznik 0|Q )
Write
Sterowanie
A ¬ A >> 1
2n-bitow
M*Q = A
n-te
powtorzenie?
TAK
Stop
Algorytm mnożenia (ver.3)
Nie
+M
>A
+M
>A
>A
>A
1111(15)
0011 (3)
11110000
01111000
101101000
10110100
01011010
00101101 (45)
Uwaga na przeniesienia podczas częściowych sumowań!
Start
A ¬0|Q
A[-1 ]¬ 0
brak opreracji
..0011111111000000..
dodaj M
odejmij M
01
10
A[0,-1]
A[2n..n] ¬ A[2n..n] - M
00
11
A[2n..n] ¬ A[2n..n] + M
A ¬ A >> 1 (arytm)
A[0] ® A[-1]
n-te
powtorzenie?
Nie
TAK
Stop
Algorytm Booth’a mnożenia liczb dwójkowych ze znakiem (U2)
n−1...k+1 k
}|
{ z}|{ z
k−1...0
}|
{
Q = 111 . . . 111 0 ak−1ak−2 . . . a1a0
(1)
k−1
0
n−2
k+1
+a
2
+
a
2
Q = −2n−1 + 2
+
.
.
.
+
2
0
k−1
|
{z
}
(2)
z
2n−1 −2k+1
k+1
k−1 + . . . + a 20
Q = −2
0
| {z } + ak−1 2
początek
ostatniego
bloku
jedynek
|
{z
(3)
}
część możliwa do przedstawienia
za pomocą sum i różnic
Przedstawienie ujemnego mnożnika Q (U2) za pomocą sum i różnic
na granicach bloków jedynek
00001101 = Iloraz (13)
10010011 = Dzielna
Dzielnik = 1011
(11)
****
(147)
- 1011
001110
1011
00001111
****
1011
00000100 = Reszta (4)
Schemat dzielenia liczb dwójkowych (bez znaku)
Dzielnik (M) | 0
Shift right
2n-bitow
Iloraz (A)
Shift left
2n-bitowe
ALU
n-bitow
Dzielna (Q) ( Reszta - 0|R)
Write
Sterowanie
2n-bitow
Q/M=A+R
Układ dzielący (ver.1)
Dzielnik (M)
n-bitow
Iloraz (A)
Shift left
n-bitowe
ALU
n-bitow
Dzielna (Q) (Reszta - R|0)
Shift left
Write
Sterowanie
2n-bitow
Q/M=A+R
Układ dzielący (ver.2)
Dzielnik (M)
n-bitow
n-bitowe
ALU
Dzielna (Q) ( R | A )
Shift right
Shift left
Write
2n-bitow
Q/M=A+R
Układ dzielący (ver.3)
Sterowanie
Start
Q[2n..n] ¬ Q[2n..n] - M
Dzielnik (M)
R>0
n-bitow
Q (R)
R<0
n-bitowe
ALU
Dzielna (Q) ( R | A )
Shift right
Shift left
Write
Q ¬ Q << 1
Q[0]=A[0]=1
Q[2n..n] ¬ Q[2n..n] +M
Q ¬ Q << 1
Q[0]=A[0]=0
Sterowanie
2n-bitow
Q/M=A+R
n-te
Nie
powtorzenie?
Tak
Stop (Q = R | A)
Algorytm dzielenia (ver.3)