二进制除法和十进制除法是一致的,都是采用:将被除数从高位除起,每次计算得到的商保留,余数加下一位数再次进行除法,依次将被除数所有位数运算完毕,得到的商按照按顺序组合,余数为最后一次运算结果。

[x]原 = 0.1011,[y]原 = 0.1101

  • 0.1011 ÷ 0.1101 = 0.1101 ... 0.00000111

    • 1011 ÷ 1101 = 0
    • 10110 ÷ 1101 = 0.1 ... 1001
    • 10010 ÷ 1101 = 0.11 ... 0101
    • 01010 ÷ 1101 = 0.110
    • 10100 ÷ 1101 = 0.1101 ... 0.00000111
  • 每做一次除法运算,如果被除数小于除数,商 0,否者商 1,在用余数减去除数,得到下一个被除数,以此循环
  • 符号位进行异或运算:0 ⊕ 0 = 0
  • 最终结果:0.1101,余数是 111

这是我们人类通过除法的竖式计算得到的结果,商 0 还是商 1,是通过比大小决定的,计算机在做除法的时候总不能凭空比大小吧?还有每次做完除法后,余数的位数也是不确定的。

那计算机该如何实现除法呢?

通过前面的学习,我们知道运算器是由 ACC 、MQ、X、ALU 组成。

ALU 是运算器的核心,计算的功能是由这部分它来完成的。ACC 、MQ、X,它们是用来暂存操作和中间结果,通过指令交由 ALU 处理。

再除法运算中,各寄存器有不同的作用:

  • ACC:被除数、余数
  • MQ:商
  • X:除数

原码除法恢复余数法

最终运算结果,商在 MQ 中,商的位数是数值位位数;余数在 ACC 中,余数的位数是 2^-n;运算结果的符号位单独处理:被除数的符号位 ⊕ 除数符号位。

运算过程

计算机每次都是商 1,如果不对,在改商 0,并恢复余数。

如何判断商 1 对不对呢?

被除数(除数) - 商: ACC - X -> ACC - [y]原 -> ACC + [-y]补,如果余数是负数,则改商 0

由于商错了,所以上一步计算的余数是不对的,需要恢复到之前的数,这时候机器肯定是没有存储它的,需要通过计算得到。

如何得到之前的数呢?

[y][-y] 互为相反数,因为上一步是加 [-y]补 得到的余数,那现在加 [y]补 得到之前的数(称为恢复余数)。

所以需要先把 [y]补[-y]补 的机器码算出来

  • [y]原 = 0.1101[y]补 = 0.1101[-y]补=1.0011

计算步骤

步骤操作ACCMQX
1被除数放置到 ACC 中,MQ 置 0010110000001101
2MQ 商 1010110000101101
3ACC - X = ACC + [-y]补 = 01011 + 10011111100000101101
4ACC 是负数,ACC 需要恢复到之前的余数,ACC + [y]补 = 11110 + 01101,MQ 从 1 变成 0010110000001101
5逻辑左移一位101100000001101
6MQ 商 1101100000101101
7ACC - X = ACC + [-y]补 = 10110 + 10011010010000101101
8ACC 是正数,不需要恢复余数010010000101101
9逻辑左移一位100100001001101
10MQ 商 1100100001101101
11ACC - X = ACC + [-y]补 = 10010 + 10011001010001101101
12ACC 是正数,不需要恢复余数001010001101101
13逻辑左移一位010100011001101
14MQ 商 1010100011101101
15ACC - X = ACC + [-y]补 = 01010 + 10011111010011101101
16ACC 是负数,ACC 需要恢复到之前的余数,ACC + [y]补 = 11101 + 01101010100011001101
17逻辑左移一位101000110001101
18MQ 商 1101000110101101
19ACC - X = ACC + [-y]补 = 10100 + 10011001110110101101
20最终符号位:被除数的符号位 ⊕ 除数符号位 = 0 ⊕ 0 = 0---

第19步,如果计算的结果是负数,还是要再进行一步恢复余数,这里计算的结果是正数,所以就结束了,不再左移了。

这里逻辑左移了 4 次,上商 5 次,所以机器位数是 n 位,那么需要逻辑左移 n 次,上商 n+1

最终结果:

  • 商:0.1101
  • 余数:0.00000111

原码除法加减交替法(不恢复余数法)

最终运算结果,商在 MQ 中,商的位数是数值位位数;余数在 ACC 中,余数的位数是 2^-n;运算结果的符号位单独处理:被除数的符号位 ⊕ 除数符号位。

运算过程

ACC - X = ACC + [-y]补 的值如果是负数,那么我们会加上它相反数的补 ACC + [y]补,这一步被称为恢复余数。

  1. ACC + [-y]补 负数
  2. ACC + [-y]补 + [y]补 恢复余数
  3. 2(ACC + [-y]补 + [y]补) 逻辑左移一位
  4. 2(ACC + [-y]补 + [y]补) - [y]补 减除数

简化得 2(ACC + [-y]补) + [y]补

  • ACC + [-y]补 如果是负数的话,将 MQ 改商 0
  • 逻辑左移一位(ACCMQ 都要逻辑左移)
  • MQ1,并且加上除数 [y]补

计算步骤

步骤操作ACCMQX
1置 0010110000001101
2MQ 商 1010110000101101
3ACC - X = ACC + [-y]补 = 01011 + 10011111100000101101
4ACC 是负数,MQ 改商 0111100000001101
5逻辑左移一位111000000001101
6MQ 商 1111000000101101
7ACC + X = ACC + [y]补 = 11100 + 01101010010000101101
8ACC 是正数,MQ 不用改010010000101101
9逻辑左移一位100100001001101
10MQ 商 1100100001101101
11ACC - X = ACC + [-y]补 = 10010 + 10011001010001101101
12ACC 是正数,MQ 不用改001010001101101
13逻辑左移一位010100011001101
14MQ 商 1010100011101101
15ACC - X = ACC + [-y]补 = 01010 + 10011111010011101101
16ACC 是负数,MQ 改商 0111010011001101
17逻辑左移一位110100110001101
18MQ 商 1110100110101101
19ACC + X = ACC + [y]补 = 11010 + 01101001110110101101
20最终符号位:被除数的符号位 ⊕ 除数符号位 = 0 ⊕ 0 = 0---

第19步,如果计算的结果是负数,MQ 还是要进行改商 0,并左移再加上 [y]补,和恢复余数法是一样的步骤。

这里逻辑左移了 4 次,上商 5 次,所以机器位数是 n 位,那么需要逻辑左移 n 次,上商 n+1

最终结果:

  • 商:0.1101
  • 余数:0.0111 × 2^-4 = 0.00000111

补码除法加减交替法

题目:[x]原 = 0.1000,[y]原 = 1.1011,[y]补 = 1.0101,[-y]补 = 0.1011

被除数和除数要用两位符号位:

  • [x]原 = 00.1000
  • [y]原 = 11.1011
  • [y]补 = 11.0101
  • [-y]补 = 00.1011

运算过程

判断被除数(余数)和除数的符号位

  1. 被除数和除数符号位判断

    • 同号,被除数减除数
    • 异号,被除数加除数
  2. 余数和除数符号位判断

    • 同号,MQ1ACCMQ 逻辑左移一位,余数减除数
    • 异号,MQ0ACCMQ 逻辑左移一位,余数加除数
  3. 循环第三步,循环的次数是机器位数

计算步骤

步骤操作ACCMQX
1置 000100000000110101
2ACC + X = ACC + [y]补 = 001000 + 11010111110100000110101
3ACC 和 X 同号,MQ 商 111110100001110101
4逻辑左移一位11101000010110101
5ACC - X = ACC + [-y]补 = 111010 + 00101100010100010110101
6ACC 和 X 异号,MQ 商 000010100010110101
7逻辑左移一位00101000100110101
8ACC + X = ACC + [y]补 = 001010 + 11010111111100100110101
9ACC 和 X 同号,MQ 商 111111100101110101
10逻辑左移一位11111001010110101
11ACC - X = ACC + [-y]补 = 111110 + 00101100100101010110101
12逻辑左移一位01001010100110101
13ACC + X = ACC + [y]补 = 010010 + 11010100011110100110101
14MQ 末尾横置 100011110101110101
15最终符号位:ACC 中的符号位 00---

第14步最终计算的结果,末尾要横置 1,其精度误差 2^-4

这里逻辑左移了 4 次,上商 5 次,所以机器位数是 n 位,那么需要逻辑左移 n 次,上商 n+1

最终结果:

  • 商:1.0101
  • 余数:0.0111 × 2^-4 = 0.00000111

总结

原码的除法运算和补码的除法运算的左移都是逻辑左移。

机器位数是 n 位,那么需要逻辑左移 n 次,上商 n+1 次,

  • 补码除法运算最后一步横置 1,其精度误差 2^-4

uccs
759 声望89 粉丝

3年 gis 开发,wx:ttxbg210604