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=10(10)
在用对齐后的被除数与除数做比较:
10(10)-10=00 刚好等于没有溢出所以上商1,商为0001,在将相减的结果(00)放到被除数有效的高位此时被除数有效的最高位为10(10),此时被除数的bit位为0010,
在左移1位:
0010<<1=001(0)
在用位移后的被除数与除数做比较:
001(0)-10=11 符号位为1负数也就是说被除数小于除数所以上商0,商为0010
在左移0位
0010<<0=0010
在用位移后的被除数与除数做比较:
0010-10=00 两个符号位都为0相等所以上商1,商为101,在将其放到商的有效高位此时被除数的有效bit位为最低的两位(00)10
所有的被除数处理完后商做结果被除数做余数,商为101,余数为00,转换成十进制就是5余0!
知识点:
现在很多CPU都有自己的乘法器和除法器,这些器件的工作原理和我上面写的一样,都是通过ALU(算术逻辑运算单元)调用加法器来协调工作完成计算!这些运算器存在于CPU内部,一般每个运算器都是由ALU,通用寄存器,专用寄存器,晶体管和一些其它附加电路组合而成,专用寄存器是指一些只能用于固定功能的寄存器,比如程序计数寄存器(PC),标志寄存器(FR),堆栈寄存器(SP),作用是固定的只能用来存放地址或者地址基址!
浮点数在计算机中有特定的浮点存储器来存放和浮点运算器来运算,不同精度的浮点数能精确到小数点后的不同位,比如float单精度能精确到小数点的后7位双精度能精确到16位,这个精确度取决于你的电脑内存和CPU,假如你的内存允许精确到7或者16位但是CPU不支持也是无法处理那么多位的!
CPU 运算实现过程的更多相关文章
- 《CPU的工作过程》
本文转载自inter官方网址:https://software.intel.com/zh-cn/articles/book-Processor-Architecture_CPU_work_proces ...
- 数据库访问优化漏斗法则- 四、减少数据库服务器CPU运算
数据库访问优化漏斗法则这个优化法则归纳为5个层次:1.减少数据访问次数(减少磁盘访问)2.返回更少数据(减少网络传输或磁盘访问)3.减少交互次数(减少网络传输)4.减少服务器CPU开销(减少CPU及内 ...
- 数据库访问优化之四:减少数据库服务器CPU运算
1.使用绑定变量 绑定变量是指SQL中对变化的值采用变量参数的形式提交,而不是在SQL中直接拼写对应的值. 非绑定变量写法:Select * from employee where id=123456 ...
- 一次显式GC导致的High CPU问题处理过程(转)
项目现场反馈系统出现性能问题,具体表现为:所有的客户端响应极其卡顿. 第一反应推测,难道是DB层面出现阻塞?检查v$session会话状态及等待类型未见异常,应该可以排除DB层面原因导致的可能. 继续 ...
- 一次显式GC导致的High CPU问题处理过程
项目现场反馈系统出现性能问题,具体表现为:所有的客户端响应极其卡顿. 第一反应推测,难道是DB层面出现阻塞?检查v$session会话状态及等待类型未见异常,应该可以排除DB层面原因导致的可能. 继续 ...
- 终于彻底搞清楚了spin-lock 之一次CPU问题定位过程总结
首先这个问题,我只是其中参与者之一.但这个问题很有参考意义,特记录下来. 还有我第一次用"彻底"这个词,不知道会不会有人喷?其实,还有一些问题,也不是特别清楚.比如说什么是CPU流 ...
- 一颗 45nm CPU的制造过程
沙子 :硅是地壳内第二丰富的元素,而脱氧后的沙子(尤其是石英)最多包含25%的硅元素,以二氧化硅(SiO2)的形式存在,这也是半导体制造产业的基础. 硅熔炼: 12英寸/300毫米晶圆级,下同.通过多 ...
- CPU boot up过程
1. CPU0 BOOT CPU1 BOOT 通过IPC互相通信 2. CPU1 BOOT 完后,loop,等待IPC from CPU0 3. cpu0 写IPC通知CPU1,cpu1 ...
- python中的list的*运算使用过程中遇到的问题
目的: 想生成一个[[],[],[]] 这样的列表, 所以就 [[]]*3 这样做了,但是这样做会有问题,这样list中的三个list其实是同一个list. 例如:a=[[]]*3,然后a[0].ap ...
随机推荐
- CentOS中rpm和yum到底有什么区别?
2020/5/19 ( Linux 软件安装的学习链接:http://c.biancheng.net/view/814.html ) 一.rpm 是什么? rpm 全称 Red-Hat Pa ...
- MySql基础_DDL_DML_DQL(资料一)
今日内容 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库? * 用于存储和管理数据的仓 ...
- 有向图的基本算法-Java实现
有向图 有向图同无向图的区别为每条边带有方向,表明从一个顶点至另一个顶点可达.有向图的算法多依赖深度搜索算法. 本文主要介绍有向图的基本算法,涉及图的表示.可达性.检测环.图的遍历.拓扑排序以及强连通 ...
- TensorFlow之张量
张量的概念 TensorFlow中的Tensor就是张量,张量是数学对象,是对标量.向量.矩阵的泛化.我们可以直接理解成张量就是列表,就是多维数组. 张量的维数用阶来表示: 0阶张量 标量 单个值 例 ...
- Redis学习(三)java使用redis
一.操作步骤 Redis除了命令行操作以外,还可以通过java代码进行操作,流程如下: 下载Jedis依赖包,并丢入工程中合适的位置 在Maven中引入redis的包 <!--引入redis包- ...
- Java Web项目获取客户端和服务器的IP地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- Chrome使用video无法正常播放MP4视频的解决方案
H5的video标签让前端开发者用一行代码就可以实现视频和音频的播放,然而,有时候我们会突然发现,某些Mp4格式的视频在Chrome下居然无法正常播放?这究竟是什么原因呢?这篇文章主要分析了部分Mp4 ...
- Centos-帮助信息-man help
man help 获取指定命令帮助信息 man cmd 获取命令详细帮帮文档 cmd --help 获取简洁命令详情
- 随机梯度下降法(Stochastic gradient descent, SGD)
BGD(Batch gradient descent)批量梯度下降法:每次迭代使用所有的样本(样本量小) Mold 一直在更新 SGD(Stochastic gradientdescent)随机 ...
- 068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题——基本数据类型传值
068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题--基本数据类型传值 本文知识点:参数传递问题--基本数据类型传值 说明:因为时间紧张,本人写博 ...