EDA之路:在计算机的底层怎么实现除法 |
您所在的位置:网站首页 › word里怎么计算除法和乘法 › EDA之路:在计算机的底层怎么实现除法 |
计算机是一个分层的信息编码系统(我之前说过)。 这个系统的层次结构从下往上依次为:数字电路,CPU指令集,汇编语言,C语言,操作系统,高级语言,应用程序。 之所以分层,是为了保证每层的实现都不会太复杂。 因为人脑的计算能力有限,(太复杂的东西)一旦超过了人脑的算力,人就hold不住了。 所以,当一个模块复杂到一定程度时,自然就要把它分层。 1,除法,是数字电路层最复杂的一个模块。除法在汇编里是一条指令,在C语言里是一个运算符,但要想用电路去实现它并不容易。 加法的实现是很简单的,0 + 0 = 0, 1 + 0 = 0 + 1 = 1, 1 + 1 = 2 = 0b10. 所以加法的前3种情况就是个二进制的或运算(或门),最后一种情况是个与非门。 当个位的2个数字都是1时,与门的输出为1,但加法的输出为0,所以要取反(加个非门)。 进位的处理是个与门,当个位的2个数字都是1时,进位的输出为1(1 & 1 = 1)。 1个二进制位的带进位加法减法,当然是加上它的相反数。 抽象代数的域的定义里并没有减法,而只有加法的逆元。电路上对加减乘除的实现,实际上是按照抽象代数来的。 乘法,实际上是把乘法口诀的结果累加起来的。 对于二进制来说,实际上只有1条乘法口诀:1 x 1 = 1。我们考虑2个二进制位的乘法: a + b * 2 = (c + d * 2)(e + f * 2) = ce + (de + cf) * 2 + [df * 4]. 在只有2个二进制位的计算机上(2位机),右边第3个式子[df * 4]已经超过了计算机的寄存器位数,所以它会被溢出! 实际考虑的只是乘法结果的低位部分,这里是低2位。 显然,结果的第0位和第1位分别是: a = ce % 2, b = (ce / 2 + de + cf) % 2. a, b, c, d, e, f都是二进制的数字(只能是0或1),这就是数字电路的乘法公式。 1个二进制位的乘法口诀就是与门电路:0 x 0 = 0 x 1 = 1 x 0 = 0, 1 x 1 = 1。 所以,乘法的电路可以用与门和加法实现! 这并不复杂,复杂的是除法:( 2,除法怎么实现?还是看上面的公式: 乘法相当于知道c, d, e, f, 求a, b, 除法相当于知道a, b, c, d,求 e, f. 但是求ab是正向运算,求ef是反向运算。 逆向总是很难的,因为信息的消失很难复原,但这里可以复原。 怎么复原? 已知 a = ce % 2,实际上只需要乘以“c的倒数”,就可以求出e的值。 这里的“倒数”并不是真正的倒数,而是在同余方程意义下的“数论倒数”。 在对2的幂同余的情况下: 1的倒数是1,因为 1 x 1 = 1,1 % 2 = 1, 3的倒数是3,因为 3 x 3 = 9,9 % 8 = 1, 5的倒是是13,因为 5 x 13 = 65,65 % 64 = 1, 依次类推,...... 所以在低位机上计算高位除法,最关键的就是求出低位整数的数论倒数! 怎么在32位机上计算64位的除法? 只要能在32位机上计算出32位整数(在同余2^32的情况下)的倒数,就可以解决64位的除法。 这个倒数怎么求?至少可以拿for循环去试验啊。 不是把32位一起处理,而是一个个的(二进制位)依次处理的情况下,实际上并不需要求一个大整数的数论倒数。 a = ce % 2,其中c肯定是1! 因为如果c是0的话,除数就是2的倍数,可以用移位来代替除法。 如果除数的第0位是0,显然把它和被除数同时右移1位,不会影响除法的结果(它们至少有1个公约数2)。 所以,真正需要除法电路去处理时,除数的个位必然是1。 根据二进制的那唯一一条乘法口诀 1 x 1 = 1,所以e = a。 因为ce都是二进制数字,显然 ce / 2 = 0,所以b = (de + cf) % 2。 所以,除法实际上也是用与门和加法实现的。 二进制计算机上的整数除法,是一个递归求解同余方程组的问题。 4位机上怎么计算8位的除法3,电路实际是并行的如果用软件实现这个算法的话,上图的代码只能一行行的执行,速度很慢。 但如果是硬件电路的话,所有的步骤都是并行的,电路会瞬间进入稳定状态,给出运算结果。 为什么C语言的书上要求尽量用移位代替(2的幂的)除法? 因为早期的CPU不一定有硬件除法。 具体的电路图我还没有试验,等我试验好了再给出来。 4位的乘法和除法的递推过程 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |