二进制乘法是什么原理?

2025-02-28 14:07:48
推荐回答(3个)
回答1:

1、无符号乘法。

无符号的乘法与加法类似,它的运算方式是比较简单的,只是也可能产生溢出。对于两个w位的无符号数来说,它们的乘积范围在0到(2w-1)2之间,因此可能需要2w位二进制才能表示。

因此由于位数的限制,假设两个w位的无符号数的真实乘积为pro,根据截断的规则,则实际得到的乘积为 pro mod 2w。

2、补码乘法。

与加法运算类似,补码乘法也是建立在无符号的基础之上的,因此我们可以很容易的得到,对于两个w位的补码数来说,假设它们的真实乘积为pro,

则实际得到的乘积为:

U2Tw(pro mod 2w。

上面的式子有一个假设,就是假设对于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。

某次部分积的最低位必须和本位乘数对齐,所有部分积相加的结果则为相乘得到的乘积。

参考资料来源:百度百科——二进制乘法

回答2:

二进制乘法原理:
  就是左移(进位)8次,每次最高位为1则加进去,8位移完就得出乘积了
  实际上和我们做10进制的乘法是一样的,只不过这里的进制是2罢了
  
  比如5×6,转成二进制就是0101×0110
  十进制乘法大家都会做,公式就是
  
  我们他当成十进制101×110来计算下看看
   4位乘积=被乘数×千位被+被乘数×百位+被乘数×十位+被乘数×个位
  既0101×0110=101×0000+101×100+101×10+101×0
  变化下:
   4位乘积=被乘数×千位数×1000+被乘数×百位数×100+被乘数×10位数×10+被乘数×个位数
  既0101×0110=101×(0×1000)+101×(1×100) +101×(1×10)+101×0
  
  再变化下:
   4位乘积=被乘数×千位数×10×10×10+被乘数×百位数×10×10+被乘数×10位数×10+被乘数×个位数
  既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0
   =(((101×0)×10)+(101×1))×10+(101×1))×10+101×0
  
  我们可以看到,实际上乘法结果就是被乘数乘以每一位乘以模(10)的N次方的累计和(其实左移位就是进位啦,看得出来吗?)
  
  而换成2进制的话很简单,把10读成二进制2就行了,结果还是:
   4位乘积=被乘数×千位数×10×10×10+被乘数×百位数×10×10+被乘数×10位数×10+被乘数×个位数
  既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0
   =(((101×0)×2)+(101×1))×2+(101×1))×2+101×0
  
   由于乘2就是移位(进位),把上面的公式中乘2换成左移位就行了
  
  PS:
  由于二进制只有0和1,乘2可以用左移一位来实现,也可以“自己加自己”来实现的,很多CPU的左移指令和“自己加自己”一样
  
  
  
  
  
  
  用软件乘法要耗费很多CPU时间,只要CPU有硬件乘法器,当然是用硬件的啦,哪会快很多的。

回答3: