二进制乘法运算器 二进制乘法原理图( 二 )


上面的式子有一个假设 , 就是假设对于w位的两个补码数来说 , 它们的乘积的低w位与无符号数乘积的低w位是一样的 。 这意味着计算机可以使用一个指令执行无符号和补码的乘法运算 。
3、乘法运算的优化 。
根据小学所学的乘法运算 , 假设两个w位的二进制数相乘 , 则需要进行w次与运算 , 然后进行w - 1次加法运算才能得到结果 。
从此不难看出 , 乘法运算的时间周期是很长的 。 因此计算机界的高手们想出了一种方式可以优化乘法运算的效率 , 就是使用移位和加法来替代乘法 。
上述优化的前提是对于一个w位的二进制数来说 , 它与2k的乘积 , 等同于这个二进制数左移k位 , 在低位补k个0 。 在书中对这一等式进行了证明 , 过程如下 。
这个过程主要应用了无符号编码的公式 。
有了上面的基础 , 就可以使用移位和加法对乘法优化了 。
对于任意一个整数y , 它总能使用二进制序列表示(假设不超过二进制的表示范围) , 因此可以将x和y乘积的二进制序列表示为如下形式(此公式在书中没有展现) 。
x * y = x * (yw-12w-1 + ... + y020) = (x << w-1) * yw-1 +....+ (x << 0 ) * y0 。
举个例子 , 对于x * 17 , 可以计算x * 16 + x = (x << 4) + x  , 这样算下来的话 , 只需要一次移位一次加法就可以搞定这个乘法运算 。
而对于x * 14 , 则可以计算 x * 8 + x * 4 + x * 2 = (x << 3) + (x << 2) + (x << 1)  , 更快的方式可以这么计算 , x * 16 - x * 2 = (x << 4) - (x << 1) 。
这里最后需要提一下的是 , 加法、减法和移位的速度并不会总快于乘法运算 , 因此是否要进行上面的优化就取决于二者的速度了 。
4、二进制乘法的运算步骤 。
二进制数乘法过程可仿照十进制数乘法进行 。
但由于二进制数只有0或1两种可能的乘数位 , 导致二进制乘法更为简单 。 二进制数乘法的法则为:
1、0×0=0 。
2、0×1=1×0=0 。
3、1×1=1 。
例如:1001和1010相乘的过程如下:由低位到高位 , 用乘数的每一位去乘被乘数 , 若乘数的某一位为1 , 则该次部分积为被乘数;若乘数的某一位为0 , 则该次部分积为0 。
某次部分积的最低位必须和本位乘数对齐 , 所有部分积相加的结果则为相乘得到的乘积 。
参考资料来源:搜狗百科——二进制乘法
二进制的乘法法则有几个?1)二进制数的加法
根据“逢二进一”规则 , 二进制数加法的法则为:
0+0=0
0+1=1+0=1
1+1=0 (进位为1)
1+1+1=1 (进位为1)
2)二进制数的减法
根据“借一有二”的规则 , 二进制数减法的法则为:
0-0=0
1-1=0
1-0=1
0-1=1 (借位为1)
3)二进制数的乘法
二进制数乘法过程可仿照十进制数乘法进行 。 但由于二进制数只有0或1两种可能的乘数位 , 导致二进制乘法更为简单 。 二进制数乘法的法则为:
0×0=0
0×1=1×0=0
1×1=1
由低位到高位 , 用乘数的每一位去乘被乘数 , 若乘数的某一位为1 , 则该次部分积为被乘数;若乘数的某一位为0 , 则该次部分积为0 。 某次部分积的最低位必须和本位乘数对齐 , 所有部分积相加的结果则为相乘得到的乘积 。
4)二进制数的除法
二进制数除法与十进制数除法很类似 。 可先从被除数的最高位开始 , 将被除数(或中间余数)与除数相比较 , 若被除数(或中间余数)大于除数 , 则用被除数(或中间余数)减去除数 , 商为1 , 并得相减之后的中间余数 , 否则商为0 。 再将被除数的下一位移下补充到中间余数的末位 , 重复以上过程 , 就可得到所要求的各位商数和最终的余数 。


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。