Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据的表示和运算

数据的表示和运算

作者头像
三哥
发布于 2020-01-17 02:53:20
发布于 2020-01-17 02:53:20
1.1K0
举报
文章被收录于专栏:java工会java工会

前言

◆ ◆ ◆ ◆

这期本来是想写hashMap的,但是里面哈希和扩容之类的,很多都是位运算,不太熟悉的同学看着会很难受,所以先补充一些计算机组成的知识。

进制转换

◆ ◆ ◆ ◆

计算机中,二进制是最广泛的一种数制,以高低电平来表示二进制。当数码很大时,书写不方便,从而引进八进制和十六进制,但是其实计算机内部都是二进制。

我们熟悉的十进制如何在计算机中表示呢,比如把十进制数19.6875转化为二进制。

首先整数部分和小数部分需要分开来算。

整数部分:除2取余,自下而上

19/2=9 余1

9/2=4 余1

4/2=2 余0

2/2=1 余0

1/2=0 余1

(商为0为结束标志)

所以余数自下而上写:10011

小数部分:乘2取整,自上而下

0.6875*2=1.375 取1 余0.375

0.375*2=0.75 取0 余0.75

0.75*2=1.5 取1 余0.5

0.5*2=1 取1 余0

(取1余0为结束标志)

所以自上而下表示:1011

综上,19.6875的二进制表示为:10011.1011

真值和计算机数

◆ ◆ ◆ ◆

日常表示为+6、-8、-0.756这样的数成为真值。但是计算机并不知道“+”,“-”。由于0、1正好为两种状态,于是就规定0表示正号,1表示负号,这样被数字化的数就称为计算机数

BCD码

◆ ◆ ◆ ◆

二进制编码的十进制数(Binary Coded Decimal,BCD)是以二进制数来编码表示二进制0-9,分为两类:有权BCD码,如8421码、2421码、5421码等;无权BCD码,如余3码、格雷码等

(1)8421码:用四位二进制数表示一位十进制数,权值从高到低为8,4,2,1。如101001表示29

(2)余3码:8421码的基础上加上十进制3

定点数的表示

◆ ◆ ◆ ◆

  1. 无符号数表示:整个机器字长全部二进制均为数值,没有符号为,相当于数的绝对值,如机器字长为8位,表示范围为0-2^8-1,即0-255
  2. 有符号数表示:0表示正号,1表示负号,一般为:原码、补码、反码 (1)3种机器数的最高位都为符号位 (2)当真值为正数时,原码、补码、反码的表示均相同,即符号位为0,数值部分和真值相同 (3)当真值为负数时,符号位为1,数值部分,补码是原码的“每位求反加1”,反码为原码的“每位求反”。注意:仅数值部分,不包括符号 如:+1110,原,补,反均为01110 -1101,原码:11101,补码:10011,反码:10010
  3. 0的原码和反码都有两种,补码只有一种

表示范围如下:

原码:-(2^(n-1) -1)~ (2^(n-1) -1)

补码:-2^(n-1) ~ (2^(n-1) -1)

反码:-(2^(n-1) -1)~ (2^(n-1) -1)

移码

◆ ◆ ◆ ◆

介绍一下补码的缺点,举个例子

从代码形式上看,符号位也是一位二进制,将这些二进制代码进行比较,会得出101011>010101,100001>011111,其实恰好相反,这就是补码的缺点,但是可以通过移码来弥补。

将每一个真值加上2^n,如例子中n为5,得到

这样就能得到110101>001011,111111>000001

加上真值的过程其实就是移码

是不是比较懵逼……

其实,移码就是补码的符号位取反

补码的好处

◆ ◆ ◆ ◆

假设机器字长为4位,一位为符号,则补码的范围为-8~7,列出看一下

0000 0 1000 -8

0001 1 1001 -7

0010 2 1010 -6

0011 3 1011 -5

0100 4 1101 -4

0101 5 1101 -3

0110 6 1110 -2

0111 7 1111 -1

优点1:补码的设计可以满足x+(-x)=0,因为高位进位舍去;知道x的补码,求-x的补码,为:x的补码连同符号位在内每位取反再加1。

优点2:0的补码只有一种

优点3:补码的符号位可以参与运算,不需要单独设置电路

优点4:采用补码运算后,补码可以将正数加负数转化为正数加正数,又可以将减法转换为加法运算,这样就只设加法器就可以了

优点5:补码可以解决补码数的扩充问题。因为在补码表示中,全“1”代表-1,所以对负数补码进行扩充,可以直接补符号位,如1001扩充为8位,可以写为11111001;0111扩充为8位,可以写为:00000111

所以大部分计算机系统都采用补码来表示机器数

定点数的移位运算

◆ ◆ ◆ ◆

当某个二进制数相对于小数点做n位左移或者右移时,相当于该数乘以或者除以2的n次方。由于计算机中的机器字长都是固定的,当机器数左移或者右移时,都会使其n位低位或者n位高位出现空缺,就需要补0或者补1。需要考虑逻辑位移和算术位移。

(1)逻辑移位:逻辑左移时,高位移丢,低位补0;逻辑右移时,低位移丢,高位补0。如寄存器的内容为:10001010,逻辑左移为00010100,逻辑右移为01000101.

(2)算术移位:

<1>当机器数为正时,

1)原码:左移右移都补0

2)补码:左移右移都补0

3)反码:左移右移都补0

<2>当机器数为负时,

1)原码:左移右移都补0

2)补码:左移补0右移补1

3)反码:左移右移都补1

补码定点数的加/减法运算

◆ ◆ ◆ ◆

(1)补码加法:符号位参加运算,两数和的补码等于两数的补码之和,公式为

[x+y]补=[x]补+[y]补

(2)补码减法:运算器只包含加法器,于是需要用到[y]补和[-y]补,公式为

[x-y]补=[x]补+[-y]补

加减法的溢出判断

◆ ◆ ◆ ◆

(1)一位符号位判断溢出:一个正数和一个负数相加是不会溢出的。参加运算的两个数符号相同,其结果的符号可能与操作数不同,即为溢出,硬件实现判断为:

最高有效位的进位异或符号位的进位=1

则为溢出

比如:两个正数相加,符号位都是0,数值的最高位产生进位1,这个进位会进到符号位,符号位由0变成1且不会向上产生进位。所以最高有效位的进位=1,符号位进位=0,异或等于1,产生溢出。如果两个操作数都是负数,如果数值的最高位向上没有进位=0,因为符号位都是1,符号位向上进位=1,产生溢出。

(2)两位符号位溢出判断:双符号位相同,则未溢出,双符号位不同,则为溢出,最高符号位代表真正的符号。

补码乘法一位乘

◆ ◆ ◆ ◆

  1. 被乘数与部分积一般取双符号位,并且符号位参与运算。(原因:一旦产生溢出,单符号位会出错,而双符号位的最高位是正确的符号位)
  2. 乘数取单符号位以决定最后一步是否需要校正,即是否加[-x]补
  3. 乘数末尾增设附件位Y(n+1),初始值为0
  4. 根据Yn和Y(n+1)判断位,进行运算,步骤同上
  5. 根据上述算法进行n+1步,但是第n+1步不再移位,仅根据Y0,Y1比较结果决定是否要加[x]补
  6. 按补码移位规则,即部分积为正时,右移过程中有效位最高位补0;部分积为负时,右移过程中有效位最高位补1;双符号的移位中,次高符号位参与移位,最高位不参与

针对第四步,给出下列规则表

是不是很懵,用一个例子来看一下:

已知[x]补=1.0101,[y]补=1.0011,求[xy]补

解:先求[-x]补=0.1011,详细过程如下

看懂表格可能就了解得差不多了。如果看不懂,可以加小明同学聊聊。

算数逻辑单元ALU

◆ ◆ ◆ ◆

数字电路一般可分为组合逻辑电路和时序逻辑电路。

  1. 组合逻辑电路:在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。也就是说,组合逻辑电路没有记忆功能,运算后的结果要立刻送入寄存器保存
  2. 时序逻辑电路:在逻辑功能上的特点是任意时刻的输出不仅取决于当时的输入信号,还取决于电路原来的状态。也就是说,时序逻辑电路具有记忆元件,即触发器(能够存储一位信号的基本单元电路),可以记录前一时刻的输出状态。

ALU是一种组合逻辑电路,因此实际使用ALU时,其输入端口A和B必须与锁存器相连,而且运算过程中锁存器(多位触发器)的内容是不变的,其输出必须送至寄存器保存。

ALU主要功能:ALU的功能不仅仅是执行算术(加、减、乘、除)和逻辑运算(与,或,非,异或)的部件,还具有先行进位逻辑。在并行加法器的并行进位链就是使用ALU。

下图就是ALU的电路框架

其中A,B为输入变量,K为控制信号,K的不同取值可以决定该电路进行哪一种算数运算或哪一种逻辑运算,F为输出

串行加法器

◆ ◆ ◆ ◆

首先介绍一下全加器。全机器是一个加法单元,而一个加法单元是一个三端输入、两端输入的加法网络,如图所示

其中Ai代表被加数,Bi代表加数,Ci-1代表低位穿来的进位,Ci代表本位向高位的进位,和为Si

只设一个全加器的加法器称为串行加法器。两个操作数分别放到两个移位寄存器中,并且由移位寄存器从低位到高位串行地提供操作数进行相加。如果操作数长16位,就需要分成16步进行,每步产生一为和,串行地送入结果寄存器,而产生的进位信号只需要一位触发器,每完成一步,用新的进位覆盖旧的进位。串行加法器的结构如下图

所得的结果保存在操作数A的寄存器中,但是每次都是一位参与运算,速度太慢。如果操作数长16位,就需要分成16步进行,这是不可接受的。于是就有并行加法器

并行加法器

◆ ◆ ◆ ◆

由n+1个全加器构成的并行加法器,这样两个n+1位的数可以利用这个加法器并行计算

对于每一个全加器,有三个输入,其中两个输入对应了参与运算的两个数的响应位,另一个输入是低位的进位。有两个输出,一个输出是对应的加法和的结果对应位,另一个输出是本地产生的向高位的进位

每个全加器的结果Si是如何产生的呢?

Si指出了运算结果某一位到底是1还是0.如果输入的三位都是1或者其中一位是1,另外两个是0,对应的Si就为1,表达式为

这个表达式中,A和B都是参与运算的数据,保存在寄存器中,但是Ci-1是由低位产生的进位,只有这个进位产生后,才能计算出Si。所以影响速率就是Ci-1的产生。

那进位C是如何产生的呢?

如果三个输入都是1,或者两个输入是1,一个输入是0,就会产生进位,表示为

我们把AiBi叫做本地进位,也就是本地参与运算的两个数据响应的位就会产生的进位。另外Ai+Bi表示传送条件,用ti表示。如果这个或的值为1,那么Ci-1的结果就会被传送到Ci。所以我们就知道进位也可以由输入的Ai和Bi知道,所以就能快速产生进位了。

我们记AiBi为di,则进位表示如下

串行进位链

◆ ◆ ◆ ◆

进位链:传送进位的电路。也就是说在加法器中,我们可以把进位产生的电路独立出来,产生进位以后相应的进位再和AiBi一起参与运算生成Si。

我们以4位全加器为例,则每一位的进位表达式为

为了使用与非门实现进位链,对上面表达式进行变换,则

根据表达式,得出通过与非门产生的串行进位链:每个进位的产生需要采用两个与非门。如C0为例,根据变换的结果,使用t0和C-1的与操作,再做非操作输出,之后用d0的非和之前得到的结果再做与操作,非操作,就可以得到C0。这样我们就可以依次得到如下串行进位链。

并行进位链

◆ ◆ ◆ ◆

串行加法还是太慢了怎么办呢,这样就可以考虑是不是可以并行输出,让n位的加法器的进位同时产生。

首先对串行进位链中得到的表达式再进行变换得到如下

回顾一下,ti=AiBi,di=Ai+Bi

这样我们就可以由每一位参与运算的的位直接得出了所有进位了!这种称为并行进位或者跳跃进位。

单重分组跳跃进位链

◆ ◆ ◆ ◆

上图的跳跃进位的电路很复杂,而且才4位数。如果是32位或者64位,则会非常庞大而且复杂。为此又产生了两种折中的跳跃进位链。

n位全加器分成若干个小组,每个小组中的进位同时产生,小组之间串行进位。

以16位为例子

上图中,组和组之间采用串行进位,也就是说当第四组中的C3产生以后,把C3作为输入输入到第三组中,这个C3和第三组中的di,ti配合,生成第三组中的所有Ci,同样第二组,第一组同理。

双重分组跳跃进位链

◆ ◆ ◆ ◆

n 位全加器分若干大组,大组中又包含若干小组。每个大组中小组的最高位进位同时产生。大组与大组之间采用串行进位。

上图中,将32为分成2个大组,每个大组中分为四个小组,每个小组中四位。C3,C7,C11,C15对应了,8,7,6,5,四个小组的最高位的进位,这四个进位同时产生。同样,对第一大组来说C19,C23,C27,C31对应了4,3,2,1四个小组中的最高位进位,这四位进位也是同时产生。另外大组和大组之间采用串行进位的方式,也就是C15产生之后,作为输入,输入到第一大组中,用以产生第一大组中每个小组的最高位的进位和其他的进位。

看完这些,考研都够用了~

◆ ◆ ◆ ◆

- end -

祝各位人人都能涨20K!

每个人都是技术大牛!

点击关注,不要走开哟~

- TEN END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java工会 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何设计一个架构
架构不是像平常写代码一样,对就是对,错就是错,它并无对错之分,是一个取舍的过程。当我们从0开始做架构的时候,的确是比较困难。虽然万事开头难,但是一个好的开始相当于成功了一半,会给我们接下去的工作打下结实的基础。
哲洛不闹
2019/06/12
7450
架构设计的真谛:系统与子系统、模块与组件、框架与架构
在软件研发这个领域,程序员的终极目标都是想成为一名合格的架构师。然而梦想很美好,但现实却很曲折。
玄姐谈AGI
2021/03/25
8310
架构设计的真谛:系统与子系统、模块与组件、框架与架构
从零开始学架构读书笔记
  软件架构的出现是为了解决系统规模增加后出现了系统耦合严重,开发效率低,逻辑复杂,扩展困难等问题。所以架构设计是为了解决软件复杂度而存在的,所以架构设计的目地是识别出需求的复杂点然后针对性的解决。系统设计时需要考虑:性能,系统的可扩展性,安全性,高可用,成本。   架构师的工作并不神秘,成熟的架构师需要对已经存在的技术非常熟悉,对已经经过验证的架构模式烂熟于心,然后根据自己对业务的理解,挑选合适的架构模式进行组合,再对组合后的方案进行修改和调整。
良辰美景TT
2018/09/11
1.1K0
从零开始学架构读书笔记
架构设计文档模板
架构设计中最重要的两个文档的模板和关键说明。这个案例文档仅给出一些关键内容供你参考,部分细节无法全面覆盖或者完全保证正确。(斜体字是示例)
Dlimeng
2023/06/30
1.1K0
架构设计文档模板
架构设计之一——基础架构
•典型表现有软件质量低下、项目无法如期完成、项目严重超支等,因为软件而导致的重大事故时有发生。
aneutron
2022/08/10
8310
浅谈软件架构
每一个程序员都有一个架构师的梦,可理想很丰满,现实很骨感---大部程序员工作中都做着简单的 CRUD,我也不例外。如果就这样还常把“架构”两个字挂在嘴边,估计程序员们都会脸红。但就因为暂时还不能成为架构师,我们就要放弃成为架构师的梦想了吗?显然不能,掌握架构设计的相关理论是成为架构师的前提,有了方法论可以更好地指导我们干活。机会总是留给有准备的人的,万一哪天梦想实现了呢?
政采云前端团队
2023/11/16
5310
浅谈软件架构
从程序员到架构师的精进之路
“程序员到架构师的技术成长之路分为几个典型的阶段:工程师 - 高级工程师 - 技术专家 - 初级架构师 - 中级架构师 - 高级架构师”
架构精进之路
2020/08/17
1.2K0
从程序员到架构师的精进之路
软件架构如何建模
相信大家对模型一词都不陌生,但是在我们实际工作中进行软件架构设计的时候,要如何去建模呢?不知道大家是怎么去理解建模一词并能实际落地? 今天我来谈谈自己在软件架构中如何进行建模.
小坤探游架构笔记
2025/04/30
1260
软件架构如何建模
架构师之路一-架构师入门指引
导读:本系列文章教你怎么样成为一名架构师,而本篇文章则带你先认识一下什么是架构师,架构师的工作是什么?
JAVA日知录
2020/03/12
3.4K0
不画一张架构图讲透架构思维
本文深入探讨软件架构的本质与设计方法论,从架构定义演变到现代架构实践挑战,系统分析架构设计面临的业务复杂度、分工困境和现实约束。作者提出“架构即软件设计本身”的核心观点,强调架构应平衡业务需求、团队协同与系统演进,并最终以实用主义视角提出“恰如其分的架构”理念。
腾讯云开发者
2025/07/24
1840
不画一张架构图讲透架构思维
Java程序员职业发展路径图,如何才能完成从新手码农到架构师的转变
从新手码农到高级架构师,要经过几步?要多努力,才能成为为人倚重的技术专家?本文将为你带来一张程序员发展路径图,但你需要知道的是,天下没有普适的道理,具体问题还需具体分析,实践才能出真知。
慕容千语
2019/06/13
1.4K0
架构师成长全景学习路线:从程序员到技术专家的进阶指南
架构师作为技术决策的核心角色,需要构建技术深度与业务广度的双重能力体系。根据《架构师启示录》(灵犀,2024)提出的知识模型,架构能力可拆解为三大维度:
码事漫谈
2025/07/28
4030
架构师成长全景学习路线:从程序员到技术专家的进阶指南
技术角 | 架构学习书摘总结(一)概念和基础部分
最近阅读了一本架构方面的入门图书叫《从零开始学架构:照着做,你也能成为架构师》,部分内容比较不错,先做书摘总结,以便加深印象与未来回顾学习。
ZNing
2020/05/13
8440
架构设计方法论沉淀
架构设计流程:识别系统复杂度->设计备选方案->评估和选择备选方案->详细方案设计
vitofliu
2021/07/06
1.3K0
5分钟了解系统架构设计(3)
最近梳理了之前学习的架构设计相关的一些课程学习总结,将其整理成了一个大纲脑图,以每篇5分钟系列展现出来,希望对你有所帮助。
Edison Zhou
2022/12/30
4310
5分钟了解系统架构设计(3)
架构设计方法初探
1. 基本概念和目的2. 架构设计复杂度来源2.1 高性能2.2 高可用2.3 可扩展性2.4 低成本、安全、规模3. 架构设计三原则3.1 合适原则3.2 简单原则3.3 演化原则4. 架构设计的流程
芋道源码
2018/12/24
4190
架构设计方法初探
直击架构本质:优秀架构师必须掌握的几种架构思维
架构的本质是管理复杂性,抽象、分层、分治和演化思维是我们工程师/架构师应对和管理复杂性的四种最基本武器。
范蠡
2019/11/06
1.3K0
直击架构本质:优秀架构师必须掌握的几种架构思维
为什么大部分人做不了架构师?
成为架构师,是许多程序员的职业梦想。然而其中只有少数有着丰厚编码积累、超强自驱力和独到思维的程序员才能最终成为架构师。其实,日常工作中小到某个功能的开发,大到整个业务系统的设计,都可以看到架构设计的影子。《从0开始学架构》一书是颇受程序员欢迎的架构设计入门教程。接下来本文作者将提取该书籍之精髓,结合自身经验分享架构设计常见方法以及高可用、高性能、可扩散架构模式的实现思路,将架构设计思维“为我所用”、提升日常研效。希望对你有帮助~
腾讯云开发者
2023/07/04
9402
为什么大部分人做不了架构师?
从零开始学架构-day04
不得不说我是三天打渔两天晒网,烂泥巴糊不上墙。 烂泥巴开始打渔。 上节跟着大佬学习了,架构的复杂度来源,现在回顾下,确实想不起来了。重新开一遍。 回顾 影响架构复杂度的几大因素,追求高性能,高可用,
袁新栋-jeff.yuan
2021/12/07
2480
从零开始学架构-day04
如何设计可扩展、高性能、高可用架构?| 极客时间
最近跟一个架构师老哥聊天,他总把“代价”放在嘴边。 他们公司业务有所变动和发展,原来的架构多少遇到了些问题,调整起来难度大,同时也牵扯到成本问题,但他又面临着业务层的压力。举棋不定、想不好如何权衡。 这是很多技术骨干和架构师工作过程中常常遇到的问题。我们都希望架构设计满足高可用、高性能、可扩展,而架构实则是权衡利弊后在现有资源约束下的“最合理决策”,这需要系统性地思考,很多时候往往牵一发动全身。 在真实的服务运行过程中,不可控因素很多,如地震、洪水等天灾,再比如主干网被挖断等人祸都会大大降低服务可用性。
深度学习与Python
2023/03/29
3310
如何设计可扩展、高性能、高可用架构?| 极客时间
推荐阅读
相关推荐
如何设计一个架构
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档