原码,补码的乘法运算

简介: 原码,补码的乘法运算
一.原码一位乘法

在手算10进制乘法中,我们是这样计算的:

这里的本质是因为:

0.211=2×10−1+1×10−2+1×10−3

0.985=985×10−3

所以0.211*0.985=(985×1×10−6)+(985×1×10−5)+(985×2×10−4)

对应:                     0.000985                        0.00985                        0.1970  

手算的2进制中也是如此:

在上述例子中,我们可以看到,0.1101和0.1011这5位的数相乘后得到了0.10001111的9位数,乘积的位数扩大,若计算机只能保存5位数,那么如何处理:

设机器字长为n+1位=5位,[x]原=1.1101,[y]原=0.1011,采用原码一位乘法求x*y

符号位单独处理:符号位=xs⨁ys𝑥𝑠⨁𝑦𝑠

数值位取绝对值进行乘法计算:

ACC:累加器,用于存放操作数,或运算结果。

MQ:乘商寄存器,在乘、除运算时,用于存放操作数或运算结果。

X:通用的操作数寄存器,用于存放操作数。

ALU:算术逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算。

在进行乘法运算时ACC存放乘积高位(正式进行乘法之前,ACC置0),MQ存放乘数,乘积低位,X存放被乘数

x=0.1101(被乘数)  y=0.1011(乘数)

运算过程如下:


1.看乘数、乘积低位:当前位=1,则ACC加上被乘数,若当前位=0,则ACC加上0


可以看到当前位为1(加深部分),则将ACC加上被乘数,这个过程由ALU中的加法电路完成


(ACC)+(X)-->(ACC)


00000+01101=01101(放到ACC中)


2.因为第2个位积与第1个位积相加时需要错位,所以将ACC与MQ进行逻辑右移

那么ACC的最低位会移动到MQ的最高位,高位补0,移出的位直接丢弃

由于现在当前位为1,所以将ACC加上被乘数

00110 +01101 = 10011

接下来继续右移:

当前为为0,ACC+0-->ACC

继续右移:

ACC+(X)--->ACC

00100+01101=10001

更新完ACC的值后,继续右移:

当前位不用参与运算,因为它是乘数的符号位,最后得到:


0.10001111,即1.1101*0.1011=0.10001111


所以总结运算过程就是:先加法再移位,重复n次(n表示数值位的个数)


3.最后符号位1⨁

⨁

0=1,所以修改符号位为1,即1.10001111


所以我们可以看到最终ACC存储的是乘积高位,MQ存储乘积的低位

以上运算过程也称原码的一位乘法,因为每次参与运算的位数为1

由机器的过程可以模拟出手算过程如下:

这里由于补码乘法一定要使用双符号位,所以原码乘法中也可以写作双符号位的形式(实际单符号也不会出错):

这一运算过程也可以运用在整数运算中:

1.运算时将.(点)改为,(逗号)

2.最终的点会在红色位置,并非黑色位置

二.补码一位乘法  

补码和原码的区别:

1.原码中进行n轮加法,移位。而补码中进行n轮加法,移位,最后需要多来一次加法

2.在原码中,当

MQ中最低位=1时,(ACC)+[|x|]原

MQ中最低位=0时,(ACC)+0

并且每次移位为逻辑右移

在补码中,每次加法可能+0,+[x]补,+[-x]补

辅助位-(减)MQ中最低位=1时,(ACC)+[x]补

辅助位-MQ中最低位=0时,(ACC)+0

辅助位-MQ中最低位=-1时,(ACC)+[-x]补

并且每次移位为"补码的算数右移"

3.原码的符号位不参与运算,补码的符号位需要参与运算

具体来看一个例子:

辅助位就是指MQ寄存器新扩展的一位,每次右移会使MQ最低位(深灰色部分)顶替原来的辅助位(红色部分)

这里注意MQ的最低位其实是辅助位,但是这里做了一下区分

因为MQ多增加了一位,所以ACC和X都会多增加一位,可以看到原码的X与MQ是存乘数与被乘数的绝对值,而这里是直接将补码存入:

[x]补=11.0011(被乘数采用双符号位),[y]补=0.1011(乘数采用单符号位,因为MQ的最后一位需要用来存放辅助位)

对于+[-x]补码的运算,会有辅助电路完成[x]补到[-x]补的转换

计算过程如下:划下划线的两位前一位是MQ的最低位(Y4),后一位是辅助位(Y5)

我来解释部分运算过程

1.根据以上规则,由于划线部分为1,0,辅助位-MQ最低位=-1,所以+[-x]补,得到运算结果为

00.1101

2.接着进行算数右移,即用与符号位相同的位进行填补,右移结果为00.0110

3.由于划线部分为1,1,辅助位-MQ最低位=0,所以加0

因为有4个数值位,所以需要进行4轮的加法和算数右移,补码需要多进行一次加法(只有加法,没有移位)

最后一次加法划线部分的前一位是符号位,所以才说补码的符号位是需要参与运算的

4.加法得到的数,在拼接上前n位,就得到乘法的运算结果:

[x*y]补=11.01110001

即x*y=0.10001111


相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
IEEE 754规格化浮点数所能表示的最大值和最小值
IEEE 754规格化浮点数所能表示的最大值和最小值
5727 1
IEEE 754规格化浮点数所能表示的最大值和最小值
|
3月前
|
缓存 人工智能 IDE
C盘爆满?windows-c-drive-cleaner 介绍:一键C盘清理Skill
windows-c-drive-cleaner 是一款 MIT 许可的 Windows C 盘智能清理工具,支持 AI Agent 对话调用或独立 PowerShell 脚本运行。首创「扫描→解释→确认→清理→汇报」流程,精准识别可再生缓存(如 uv、IDE、WPS、Notion 等),按 safe/caution/dangerous 三级风控,首次使用常清 20–30GB,安全不误删。(239 字)
916 0
|
JavaScript 前端开发 C++
【蓝桥杯Web】2022年第十三届蓝桥杯Web大学组省赛真题解析(完整版)
【蓝桥杯Web】2022年第十三届蓝桥杯Web大学组省赛真题解析(完整版)
【蓝桥杯Web】2022年第十三届蓝桥杯Web大学组省赛真题解析(完整版)
|
前端开发
HTML+CSS实现小米官网首页(一)
HTML+CSS实现小米官网首页
|
关系型数据库 Linux 数据库
PostgreSQL 入门指南:安装、配置与基本命令
本文从零开始,详细介绍如何在 Windows、Linux 和 macOS 上安装和配置 PostgreSQL,涵盖30+个实操代码示例。内容包括安装步骤、配置远程访问和用户权限、基础数据库操作命令(如创建表、插入和查询数据),以及常见问题的解决方案。通过学习,你将掌握 PostgreSQL 的基本使用方法,并为后续深入学习打下坚实基础。
17208 1
|
Shell
shell获取命令输出和返回值
shell获取命令输出和返回值
3197 0
|
C语言
next数组的两种求法详解及完整代码
求字符串的next数组: 方法一: 这里我们将next数组第1,2位分别设为0,1(还有-1,0这种设法,这里先将其设为0,1若有需要再减一即可) 后面求解每一位的next值时,根据前一位进行比较。 从第三位开始,将前一位与其next值对应的内容进行比较, 如果相等,则该位的next值就是前一位的next值加上1; 如果不等,向前继续寻找next值对应的内容来与前一位进行比较, 直到找到某个位上内容的next值对应的内容与前一位相等为止, 则这个位对应的值加上1即为需求的next值; 如果找到第一位都没有
1260 0
next数组的两种求法详解及完整代码
|
算法
海明码详解
本文详细介绍了海明码(Hamming Code)的概念、原理和应用,包括信息位与校验位的关系、校验位的计算方法、错误检测与纠正过程,并通过实例展示了如何使用海明码进行编码,突出了海明码在提高数据传输可靠性方面的重要性。
2969 0
海明码详解
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
安全 Linux 程序员
入职必会-开发环境搭建34-FinalShell下载和安装
在企业开发中,Linux服务器一般都是在远程的机房中,我们不可能坐在机房里面操作服务器上的Linux系统,所以在学习Linux之前我们需要远程连接Linux系统。工作中一般使用SSH协议远程连接Linux。
19576 1
入职必会-开发环境搭建34-FinalShell下载和安装