热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

左移和右移的运算规则_CPU中的加减乘除运算

本篇文章奖给大家解释CPU内部是怎样进行加减乘除的!加法运算过程:十进制:112二进制010110实现过程:在做加法时CPU

本篇文章奖给大家解释CPU内部是怎样进行加减乘除的!

加法运算过程:

十进制:

1+1=2

二进制

01+01=10

实现过程:

在做加法时CPU内部会调用加法器,实际上加法运算器所做的工作就是按位与操作和进位运算!所谓的进位运算规则和十进制一样满10进一而二进制就是满2进1,01&01=01,由于两个二进制位上的数相加等于2符合满二进一的规则则向前一位进一:10 整数的补码就是本身所以不需要补码。

减法运算过程:

在说一下减法运算

十进制:

5-2=3

二进制:

0101-0010=011

实现过程:

在做减法时要先将减数转换成负数然后补码,在进行与运算然后进位补码!

先将010转换负数原码 转换过程如下:

先取反(包括符号位)010取反101,在取反110得到负数的原码在补码111,在与加数进行与运算0101&0111=1001由于1+1=2进位1010在补码得到1011最后在取反(包括符号位)0100,在取反(不包括符号位)得到正数的原码0011在补码0011整数的补码就是本身!在进行加法运算时不需要做额外的补码运算,所以加法运算要快于减法运算!

乘法运算过程:

十进制:

5*2=10

二进制:

0101*0010=01010

实现过程:

首先CPU会初始化三个通用寄存器用来存放被乘数,乘数,部分积的二进制数,部分积寄存器初始化为0!

然后在判断乘数寄存器的低位是低电平还是高电平(0/1)!

如果为0则将乘数寄存器右移一位,同时将部分积寄存器也右移一位,在位移时遵循计算机位移规则,乘数寄存器低位溢出的一位丢弃,部分积寄存器低位溢出的一位填充到乘数寄存器的高位,同时部分积寄存器高位补0!

如果为1则将部分积寄存器加上被乘数寄存器,在进移位操作。

当所有乘数位处理完成后部分积寄存器做高位乘数寄存器做低位就是最终乘法结果!

CPU处理过程:

0101*0010=1010

首先初始化三个通用寄存器存放被乘数(0101),乘数(0010),部分积(0000),在判断乘数寄存器为0/1,判断乘数寄存器(0010)低位为0则直接进行对乘数寄存器和部分积寄存器进行位移!

乘数寄存器:0010->1=0001溢出0丢弃

部分积寄存器:0000->1=0000溢出0填充到乘数寄存器高位同时部分积寄存器高位补0

此时乘数寄存器里的二进制数为0001,部分积寄存器为0000!

在判断乘数寄存器低位为0/1,判断结果为1则先让部分积寄存器加上被乘数寄存器在进行位移动!

部分积加上被乘数:

部分积寄存器:0000+0101=0101

位移:

乘数寄存器:0001->1=0000低位溢出的1丢弃

部分积寄存器:0101->1=0010

低位溢出的1填充到乘数寄存器高位同时部分积寄存器高位补0

此时乘数寄存器为1000,部分积寄存器为0010!

在判断乘数寄存器低位为0直接位移

乘数寄存器:1000->1=0100低位溢出的0丢弃

部分积寄存器:0010->1=0001,低位溢出的0填充到乘数寄存器高位同时部分积寄存器高位补0

在乘数寄存器为0/1,判断结果为0则直接进行位移:

乘数寄存器:0100->1=0010低位溢出的0丢弃

部分积寄存器:0001->1=0000低位溢出1填充到乘数寄存器高位同时部分积寄存器高位补0

位移完后的乘数寄存器为1010,部分积寄存器为0000。

当所有乘数处理完后部分积寄存器做高位乘数寄存器做低位:00001010,转换为十进制就是10!

除法运算过程:

十进制:

10/2=5

二进制:

1010/10=101

实现过程:

首先CPU会初始化三个寄存器,用来存放被除数,除数,部分商!余数(被除数与除数比较的结果)放到被除数的有效高位上!

CPU做除法时和做除法时是相反的,乘法是右移,除法是左移,乘法做的是加法,除法做的是减法。

首先CPU会把被除数bit位与除数bit位对齐,然后在让对齐的被除数与除数比较(双符号位判断)。

这里说一下什么是双符号位判断:

比如01-10=11(前面的1是符号位) 1-2=-1 计算机通过符号位和后一位的bit位来判断大于和小于,那么01-10=11 就说明01小于10,如果得数为01就代表大于,如果得数为00代表等于。

如果得数大于或等于则将比较的结果放到被除数的有效高位上然后在商寄存器上商:1 并向后多看一位

(上商就是将商的最低位左移1位腾出商寄存器最低位上新的商)

如果得数小于则上商:0 并向后多看一位

然后循环做以上操作当所有的被除数都处理完后,商做结果被除数里面的值就是余数!

CPU处理过程:

首先初始化三个寄存器存放被除数,除数,部分商,部分商会初始化为0(可初始化也可以不初始化因为会做上商过程)

首先把被除数寄存器左移2位与除数寄存器对齐:

1010<<2&#61;10(10)

在用对齐后的被除数与除数做比较:

10(10)-10&#61;00 刚好等于没有溢出所以上商1&#xff0c;商为0001&#xff0c;在将相减的结果(00)放到被除数有效的高位此时被除数有效的最高位为10(10)&#xff0c;此时被除数的bit位为0010,

在左移1位&#xff1a;

0010<<1&#61;001(0)

在用位移后的被除数与除数做比较&#xff1a;

001(0)-10&#61;11 符号位为1负数也就是说被除数小于除数所以上商0&#xff0c;商为0010

在左移0位

0010<<0&#61;0010

在用位移后的被除数与除数做比较&#xff1a;

0010-10&#61;00 两个符号位都为0相等所以上商1&#xff0c;商为101&#xff0c;在将其放到商的有效高位此时被除数的有效bit位为最低的两位(00)10

所有的被除数处理完后商做结果被除数做余数&#xff0c;商为101&#xff0c;余数为00&#xff0c;转换成十进制就是5余0&#xff01;

知识点&#xff1a;

现在很多CPU都有自己的乘法器和除法器&#xff0c;这些器件的工作原理和我上面写的一样&#xff0c;都是通过ALU(算术逻辑运算单元)调用加法器来协调工作完成计算&#xff01;这些运算器存在于CPU内部&#xff0c;一般每个运算器都是由ALU&#xff0c;通用寄存器&#xff0c;专用寄存器&#xff0c;晶体管和一些其它附加电路组合而成&#xff0c;专用寄存器是指一些只能用于固定功能的寄存器&#xff0c;比如程序计数寄存器(PC)&#xff0c;标志寄存器(FR)&#xff0c;堆栈寄存器(SP)&#xff0c;作用是固定的只能用来存放地址或者地址基址&#xff01;

浮点数在计算机中有特定的浮点存储器来存放和浮点运算器来运算&#xff0c;不同精度的浮点数能精确到小数点后的不同位&#xff0c;比如float单精度能精确到小数点的后7位双精度能精确到16位&#xff0c;这个精确度取决于你的电脑内存和CPU&#xff0c;假如你的内存允许精确到7或者16位但是CPU不支持也是无法处理那么多位的&#xff01;

---------------------

作者&#xff1a;17岁boy想当攻城狮



推荐阅读
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了MyBioSource转甲状腺素蛋白定量检测ELISA试剂盒的应用方法及特点。ELISA法作为一项新技术在免疫诊断中的应用范围不断扩大,不仅适用于多种病原微生物引起的传染病、非传染病的免疫诊断,也可用于大/小分子抗原的定量检测。ELISA法具有灵敏、特异、简单、快速、稳定及易于自动化操作等特点,是一种早期诊断的良好方法,也可用于血清流行病学调查。MyBioSource转甲状腺素蛋白定量检测ELISA试剂盒使用方法包括对血清和血浆的操作要求。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 本文介绍了在win7电脑上进行文件加密的方法,包括利用NTFS的EFS进行加密和使用Win7旗舰版的Bitlocker加密整个分区。同时推荐了超级加密3000、宏杰加密工具和超级盘加密工具等多种加密软件,这些软件具有快速的加密速度和高强度的加密功能,可以防止文件的删除、复制和移动。此外,还强调了保持加密密钥的重要性,以免重装系统后无法打开已加密的文件。最后,提醒读者选择绿色软件,方便使用。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
author-avatar
手机用户2502852661
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有