建站seo推广,wordpress自定义侧边栏,美工设计网页培训,营销型网站建设的主要流程包括乘法理解
对于最熟悉的十进制乘法很最基本的运算原理就是一个乘数乘以另一个乘数的个位、十位、百位数字然后求和。比如 放到二进制来看其实它也是这样的#xff0c;多位数的乘法就是一个乘数乘上另一个乘数的各位求和。那么#xff1a;
布斯算法及原理
原理
已经知道两…乘法理解
对于最熟悉的十进制乘法很最基本的运算原理就是一个乘数乘以另一个乘数的个位、十位、百位···数字然后求和。比如 放到二进制来看其实它也是这样的多位数的乘法就是一个乘数乘上另一个乘数的各位求和。那么
布斯算法及原理
原理
已经知道两个二进制数的乘法的实质是上面式子中那样了假设例举的两个数1101和1110是无符号数那么作乘法按照下面的式子来 这里也体现了各位相乘最后求和的思想。按照上面直接来乘可以看到是要计算三位非0位与乘数的积然后求和如果说一个乘数的非零位特别多1111111111110那么运算次数就会更多。而布斯算法很好地解决了这个问题。既然加法会乘这么多次那么用减法就好了。所以上面的1110可以写成10000-10那么只用乘两次再作减就可以得到结果了所以这就是布斯算法的原理。通过把求和转换成求差简化运算的次数。 具体算法
算法的基本思想是在乘数的末位添加一个0乘数中出现连续的0和连续的1处不进行任何运算出现10时作减法出现01时作加法。每次只做一位乘法因而每一步都右移一位。(来自于《计算机系统基础》)
依然以1101和1110为例(依然为无符号数)被乘数是1101乘数是1110我们知道 上面的过程就体现了布斯算法的简化。由上面观察1110 - 01110 - (10000 - 10)把这个减法式子统一到一个位串里可以写成100(-1)0。上面的减法是为了简化运算选什么数来作减可以把原来为1的位简化成0呢明显是高位比11…10…0还高一位的100…00…0减去高位与11…10…0末位1同位的00…10…0序列而01就标示出了一段连续1的开头而10也标示出了一段连续1的结尾只是开头的地方是加而结尾的地方是减去(不知道说清楚没有)对于连续的1在转化过后明显都变成了0所以这些位就不用理睬。
下面实际地计算一下这两个无符号数1101和1110结果和中间结果取8位 带符号数的计算
无符号数按照常规的方法可作如下计算(依然沿用前面的例子) 得到的答案是正确的但是当1101和1110是带符号数的时候这个答案就不对。难道用常规方法就不能进行带符号数的运算吗。当时在看这部分的时候书上有一句话“对于带符号整数乘法大多数处理器中会使用专门的补码乘法器来进行运算一位补码乘法称为布斯乘法”所以那个时候在还不太了解布斯乘法所以误以为该算法无法进行带符号数的运算。其实后来发现常规算法也是可以计算的但是结果为什么不对原因在于以上两个数为例进行乘法时中间数其实是乘数和被乘数被扩展成8位后进行各位相乘再截断为8位得到的所以还是先看成无符号数把位填充满得到的是如下 而之前算不对原因并非在于是否使用了布斯乘法而是进行扩展的时候依然按照无符号数的方式进行了0扩展得到的结果自然不对。
现在把上面的数看成符号数处理1101 -3, 1110 -2所以正确计算后的结果应该是6 00000110 6计算正确。但是这样的方式计算真的好长因为非0位太多而要进行7次累加换成布斯算法 更加简单了所以实际运算的时候使用的是补码乘法器运用布斯算法专门对带符号数进行运算。
布斯算法在乘法器中的应用
现在有两个带符号数a -2和b -3他们在乘法器中的运算如下
a与b补码的长度和为8位又因为被乘数的末尾也可能是连续1的结尾所以添加一个附加位0以能够作出10标志的识别。所以首先设一个P长度为4 4 1 9还有A和S初始值如下 每一次都读取P的末两位来判断现在是进行加操作还是减操作加减操作过后每次还需要把P向右移此处是算数右移。通过上面的描述其实能对应到之前讲的算法。P在10时作减前面说过作减可以通过加负数补码解决也就是加上S等同于作减法。P在01时作加也就直接用P加A就行。分错开的初始值使得被乘数b与乘数a不会被交叠而影响到对被除数中各位数的读取而多次运算移位的过程其实就是手写运算时各位做乘得到中间值然后累加的过程