计算机组成原理--除法运算的方法

  在早期的计算机中,进行加/减运算,通常都是用加法器来完成的。 因为,在早期的计算机中,并没有减法器,只能用补码代替负数,再用加法器来完成减法运算。
  但是,在经历了 “晶体管、集成电路、大规模集成电路” 几个时代之后,计算机的 CPU 中,都集成了 “算术逻辑单元(ALU)”。 那么,再做减法运算,显然就是由减法器直接完成了。 这时,就不再需要讨论怎么变换成补码再相加了。

  计算机具有了减法器(或减法电路),让计算机做除法,也就简单多了。

  在讨论计算机做除法运算之前,先讨论一下除法,到底是怎么进行的。

  下图,是分别是两个二进制数做乘/除运算的竖式的示意图。

  乘法,是把被乘数进行移位累加。 除法,是把除数进行移位连减
  乘积的位数,是两个乘数的位数之和。 而除法,位数的关系,也可以从图中看出来。
  为了规范起见,两个乘数,都选用了四位二进制数,那么,乘积,就必然是八位了。

  而要在八位的被除数中,得到四位的商(和四位的余数),就要有一个要求:
    
被除数的高四位,必须小于除数。 
  否则,将会出现五位的商。
  换句话说,就是:除数必须足够大,否则,就会溢出了。

  满足了上述条件之后,由上图可见,每次做减法,都是:用五位被除数,减去四位的除数。 得到的差,就称为余数
  下一步,是在余数的后面,落下来一位被除数,就又凑成了五位,再减除数吧。。。

  上图中所示的步骤是小学学过的做法:把除数逐步的右移、再相减。
  与之等效的方法则是:令除数不动,而是把被除数(或余数)逐步的左移,再与除数相减。
  此时的操作步骤,可见下图所示。

  因为要得到四位的商,所以,就必须进行四次减法运算。

  在第①步中,被除数是:1000 0110。四位的除数,本来是 1010。可见上图中画红线的数字。
  因为除数要与被除数的高五位对齐再相减,所以,就令除数为:0
101 0000
  因为做而论道打算用八位的减法电路来做减法运算,所以就在
1010 的前后,凑上了四个 0
  经过相减,得到的差是:0011 0110、借位:0。 
  借位是 0,就代表够减了,那么,本位的商,就应该是 1。
  相减之后,就要把差左移一位,作为下一步的被除数。右边出现的空位,正好用来保存商。
  左移后,新的被除数就是:
0110 110 (
商 1)

  在第②步中,被除数是:0110 1101。
  除数没有变动,仍然是:0101 0000。
  相减后,差就是:0001 1101、借位:0。
  借位是 0,就代表够减了,那么,本位的商,就应该是 1。
  然后,把差再左移一位,作为下一步的被除数,右边空位再保存新的商。
  左移后,可得到被除数:0011 10 (
商 11)

  在第③步中,被除数是:0011 1011。
  除数没有变动,仍然是:0101 0000。
  相减后,差就不用管了,因为借位出现了 1 !
  借位是 1,就代表不够减,那么,本位的商,就应该是 0。
  此时的差,不用保留。 只需对这个不够减的被减数左移即可。
  左移后,此时被除数就是:0111 0 (
商 110)
  有些教材在这一步,要再做一次加法来 “恢复余数”。 实际上,是个多余的操作。 你别保存这个差,不就完事大吉了吗?

  在第④步中,被除数是:0111 0110。
  除数没有变动,仍然是:0101 0000。
  相减后,差就是:0010 0110、借位:0。
  然后对这个差,左移一位,右边添上本位的商,即为:0100 (
商 1101)。

  至此,就做完了八位二进制数除以四位二进制数的运算。
  运算结果是:余数(即差)为 0100、
商为 1101
  算的对不对呢? 
  你可以用这个公式进行验算:商 × 除数+余数 = 被除数。
  算算吧,结果,确实是被除数 1000 0110。 本次除法运算,是正确的。
  做而论道还实验了许多不同的数值,都是正确的。
  这就可以说明,这种除法的方法,是正确无误的。

  需要说明的是:上述除法运算的方法,是针对无符号数进行的。 如果把上述的被除数、除数都当做有符号数来理解,运算结果,就不正确了。

  经过上述除法步骤的讨论,可以总结出几个不值一提的小小结论。
   1、被除数的位数,应该选为除数位数的二倍。这样就可得到:与除数位数相同位数的商和余数。
   2、除数有多少位,就做多少次减法运算和移位。 于是就可得出同样位数的商。
   3、每次减法运算,被除数的位数,都要比除数多一位。
   4、减法运算后,如果借位是 0,商即为 1,否则,商为 0。
   5、减法运算后,如果借位是 0,就把差,更新到被除数的位置。
   6、减法运算后,如果借位是 1,就不用理会差了,被除数不用变。
   7、然后,把被除数左移一位,右边空出来的位,就用来保存本位的商。
   8、继续相减、移位,直到预定的次数。
   9、到了最后,被除数所在的位置,就是:余数和商。

  弄懂了上述运算步骤,用 ALU 中的减法运算功能来实现除法运算,就是很容易的事了。

  如果需要对有符号数做除法,可以先求出被除数和除数的绝对值,再利用本方法,即可算出商的绝对值。 而商的符号位,则需要用被除数和除数的符号位进行异或的算法来求出。

  有符号数变到绝对值、原码变换成补码,做而论道都曾给出过电路,大家往前翻一翻,就可以找到的。 至于异或运算,就太简单了,大家都会的,这里就不讲了。

--本文完--

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值