计算机是如何实现乘法运算

机器码中看到的 , 是用来区分符号位和数值位的,并不实际意义

二进制的乘法运算和十进制乘法运算是一样的,都是采用:被乘数绝对值和乘数绝对值的每位相乘,然后错位相加

[x]原 = 1.1101,[y]原 = 0.1011

  • 1.1101 × 0.1011 = 1.10001111

    • 0.1101 × 0.0001 = 0.00001101
    • 0.1101 × 0.001 = 0.0001101
    • 0.1101 × 0.00 = 0.000000
    • 0.1101 × 0.1 = 0.01101
  • 错位相加:0.00001101 + 0.0001101 + 0.000000 + 0.01101 = 0.10001111
  • 符号位进行异或运算:1 ⊕ 0 = 1
  • 最终结果:1.10001111

这个是我们人类通过竖式计算得到出结果,那么计算机要怎么实现这个步骤呢?难道也是像人类一样,被乘数和乘数每位相乘,然后在错位相加?

这样做的话,乘数有多少位,就需要多少个寄存器,这就增加了硬件成本。

那计算机该如何实现乘法呢?

通过前面的学习,我们知道运算器是由 ACCMQXALU 组成。

ALU 是运算器的核心,计算的功能是由这部分它来完成的。ACCMQX,它们是用来暂存操作和中间结果,通过指令交由 ALU 处理。

在乘法运算中,各寄存器有各种不同的作用:

  • ACC:乘积高位
  • MQ:乘数,乘积低位
  • X:被乘数

原码一位乘法

原码的一位乘法最终的运算结果是:ACC + MQ,运算结果的符号位在 ACC 符号位后(隐含位置)。

运算过程

在原码的一位乘法中,进行 n 轮加法和移位

  • 每次加法可能是 +0+[|x|]原,需要根据 MQ 最后一位来判断

    • MQ 最低位是 1,则 (ACC) + [|x|]原
    • MQ 最低位是 0,则 (ACC) + 0
  • 每次移位是逻辑右移
  • MQ 最后一位是符号位的话不参与运算(到此运算结束)
  • 运算结果的符号位:被乘数和乘数的符号位进行异或运算
  • 运算结果数值位:ACC + MQ

计算步骤

步骤操作ACCMQX
1ACC 置 00,00000,10110,1101
2MQ 末尾是 1,ACC + X = 00000 + 011010,11010,10110,1101
3逻辑右移一位0,011010,1010,1101
4MQ 末尾是 1,ACC + X = 00110 + 011011,001110,1010,1101
5逻辑右移一位0,1001110,100,1101
6MQ 末尾是 0,ACC + 0 = 01001 + 00,1001110,100,1101
7逻辑右移一位0,01001110,10,1101
8MQ 末尾是 1,ACC + X = 00100 + 011011,00011110,10,1101
9逻辑右移一位,MQ 最后一位是符号位,运算结束0,100011110,0,1101
10最终符号:被乘数符号位 ⊕ 乘数符号位 = 1 ⊕ 0 = 1---

第9步,右移一位后,符号位移动到最后了,在原码的一位乘法中,最后一位符号位是不参与运算的。

所以最终的结果是 1.10001111

补码一位乘法

补码的一位乘法中 MQ 需要使用到辅助位,所以在最后一位补 0(称为辅助位,原本的最后一位称为最低位)

  • ACC 在高位补 0
  • X 在高位补充一位符号位(符号位是 00,是 11

它的最终运算结果是 ACC + MQ 符号位前的值,运算结果的符号就是 ACC 最终结果的符号位。

运算过程

在补码的一位乘法中,进行 n 轮加法和移位

  • 每次加法可能是 +0+[x]补+[-x]补,需要根据 MQ 最后两个来判断

    • MQ 的最后一位称为辅助位,最后第二位称为最低位
    • 辅助位 - 最低位 = 1 时,则 (ACC) + [x]补
    • 辅助位 - 最低位 = 0 时,则 (ACC) + 0
    • 辅助位 - 最低位 = -1 时,则 (ACC) + [-x]补
  • 每次移位是算术右移

    • ACC 中符号位不参与移位,MQ 中符号参与移位
    • ACC 中正数右移,数值位补 0;负数右移,数值位补 1(符号位是啥就是啥)
  • MQ 最后一位是符号位也会参与运算
  • 运算结果的符号位:ACC 中最终结果的符号位
  • 运算结果:ACC + MQ 符号位前的值

计算步骤

在计算之前,需要先准备好被乘数的补码:[x]补 = 11.0011[-x]补 = 00.1101

步骤操作ACCMQX
1ACC 置 000,00000,1011011,0011
2MQ(辅助位 - 最低位) = 0 - 1 = -1,ACC + [-x]补 = 000000 + 00110100,11010,1011011,0011
3算术右移一位00,011010,101111,0011
4MQ(辅助位 - 最低位) = 1 - 1 = 0,ACC + 0 = 000110 + 00000000,011010,101111,0011
5算术右移一位00,0011010,10111,0011
6MQ(辅助位 - 最低位) = 1 - 0 = 1,ACC + [x]补 = 000011 + 11.001111,0110010,10111,0011
7算术右移一位11,10110010,1011,0011
8MQ(辅助位 - 最低位) = 0 - 1 = -1,ACC + [-x]补 = 11,1011 + 00110100,10000010,1011,0011
9算术右移一位00,010000010,111,0011
10MQ(辅助位 - 最低位) = 1 - 0 = 1,ACC + [x]补 = 00,0100 + 11001111,011100010,111,0011
11最终符号:ACC 中的符号位:1---

相比于原码的一位乘法,补码的一位乘法在第九步算术右移后,符号位也要参与运算,也是说比原码的一位乘法多一步加法操作

所以最终的结果是:1.01110001

总结

补码的一位乘法运算过程比原码的运算过程多一步加法运算。

假如说数值位是 4,原码的一位乘法逻辑右移 4 次,做 4 次加法运算;补码的一位乘法算术右移 4,做 5 次加法运算。

也就是说原码的一位乘法进行 n 次右移,n 次加法,补码的一位乘法进行 n 次右移,n + 1 次加法。


前端学习笔记
一步一个脚印

一只刚刚接触前端的小鸟

594 声望
73 粉丝
0 条评论
推荐阅读
《图解 Google V8》事件循环和垃圾回收——学习笔记(三)
这是《图解 Google V8》第三篇/共三篇:事件循环和垃圾回收这里主要讲了 2 点:事件循环:宏任务和微任务什么是微任务微任务的执行时机垃圾回收垃圾回收运行过程垃圾回收算法通过这个专栏的学习,V8 不在是个陌生...

uccs阅读 290

封面图
补计算机基础
数据存储的最小单位。在计算机中的二进制数系统中,位,简记为b,也称为比特,每个0或1就是一个位(bit)。计算机中的CPU位数指的是CPU一次能处理的最大位数二进制数系统中,位简记为b,也称为比特,每个二进制数字0...

Macrohoo1阅读 596

再快一点?动态内容如何加速
近年来 Web 3 的概念在程序员的小圈子也几乎是人尽皆知了。功能再强,噱头再足,但是如果访问速度没有跟上,一起都是浮云。哪怕拿现在已经成熟的 Web 2.0来说,内容也相当丰富,动态网页、个性化内容、电子交易数...

菜农曰阅读 963

封面图
TCP协议是如何保证数据的可靠传输的
一个数据包,从聊天框里发出,消息会从聊天软件所在的用户空间拷贝到内核空间的发送缓冲区(send buffer),数据包在传输层添加一个TCP头部、在网络层添加一个IP首部,进入到数据链路层添加一个首部和尾部,将其...

爆裂Gopher阅读 444

封面图
三体中的人列计算机到底是啥?
大家好,我是鹤涵。大家最近看三体电视剧版本了吗?跟原著还原度非常高,甚至超过原著(画面震撼呀)!其中第15集,居然出现了冯.诺依曼+秦始皇的组合,用3000w名士兵组成了一台人形计算机。作为程序员我可不困了,...

程序员鹤涵阅读 396

封面图
GBK & UTF-8
GBK是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB...

老污的猫阅读 97

一只刚刚接触前端的小鸟

594 声望
73 粉丝
宣传栏