Division:
From SPARC Architure, Assembly Language Programming, & C
by Richard P. Paul:
Restoring Division Example: (two's complement!)
10111 + 1
_____________
0100000 ) 01011100001 (737/32 base 10)
1100000 (-32 base 10)
_______
00011100001 positive, set 1 into quotient
1100000 shift and subtract again
_______
1111100001 negative, set 0 into quotient
0100000 get old dividend back by adding instead of subtracting
_______ (no shift!) this is a _restore_
0011100001
1100000 shift and try again
_______
001100001 positive, set 1 into quotient
1100000
_______
01000001 positive, set 1 into quotient
1100000 shift and subtract again
_______
000001 positive, set 1 into quotient
remainder is 1
Non-Restoring Division Example:
Instead of restoring when getting a negative number, you can shift and add
(instead of restore), along with recording a zero into the quotient--this
example explains things a little better...
10111 remainder of 1
_____________
0100000 ) 01011100001 (737/32 base 10)
1100000 (-32 base 10)
_______
00011100001 positive, set 1 into quotient
1100000 shift and subtract again
_______
1111100001 negative, set 0 into quotient
0100000 shift and _add_ (instead of restore!) compare w/ above
_______
001100001 positive, set 1 into quotient
1100000 shift and subtract
_______
00100001 positive, set 1 into quotient
1100000 shift and subtract
_______
000001 positive, set 1 into quotient
remainder is 1
--end of SPARC manual reference---
Another example of non-restoring division:
0110010 base 2 = 50 base 10
01010 base 2 = 10 base 10 two's comp = 10101 + 1 = 10110 = 10110
101, no remainder 5 base 10
_________
01010 ) 0110010
10110
-----
0001010 positive, set 1 into quotient
10110 shift and subtract
-----
110110 negative, set 0 into quotient
01010 shift and _add_
-----
00000 positive, set 1 into quotient, remainder of 0, done
One student posed the question similar to the following:
Why not just do the following (for unsigned representation)?
10100 remainder of 10 (20 base 10 remainder of 2)
___________
1010 ) 11001010 (202/12 base 10)
- 10100000 by inspection, we can see we can subtract here and
________ put a one in the quotient (note we have to perform a
00101010 subtract which requires a borrow)
- 101000 here again, by inspection, we can see we can subtract
______ and put a one in the quotient
000010
So...
Isn't this easier? It might be for humans to divide binary numbers this way,
but it is hard for a computer to follow our normal algorithm.
In this algorithm, we must perform subtraction which in some instances,
requires borrowing. This is very difficult and expensive to implement in
logic (gates). Also, determining how many bits to shift the divisor to find
the correct next subtraction requires lots of steps (time) and extra logic.
On the other hand, the restoring and non-restoring algorithms can be easily
implemented in logic. (You'll have to trust me on this one. When you take
CS552, the reasons for using the first two algorithms will become apparent.)