一、进制转换
二进制与十进制
整数
十进制→→二进制
二进制 →→十进制
小数
十进制→→二进制
二进制 →→十进制
八进制与十进制
八进制范围 0-7 ;八进制前缀 0
整数
十进制→→八进制
八进制→→十进制
小数
十进制→→八进制
八进制→→十进制
十六进制与十进制
十六进制 0-9 A-F ;十六进制前缀0x
十进制→→十六进制
十六进制→→十进制
小数
十进制→→十六进制
十六进制→→十进制
八进制与二进制
八进制前缀0
以小数点为界,分别向左右每三位二进制数合成一位八进制数,或每一位八进制数展成三位二进制数,不足三位者补0
八进制→→二进制
二进制→→八进制
十六进制与二进制
十六进制前缀0x
以小数点为界,分别向左右每四位二进制合成一位十六进制数,或每一位十六进制数展成四位二进制数,不足四位者补0
十六进制→→二进制
二进制→→十六进制
二、数据的表示 :原码、反码、补码、移码
以数字1为例,分+1和-1
(1字节8比特)
+1 | -1 | 变化方法 | 1+(-1) | |
原码 | 0000 0001 | 1000 0001 | 数字的二进制形式,最高位是符号位0为正1为负 | 2 |
反码 | 0000 0001 | 1111 1110 | 正数与原码相同,负数符号位不变其余位取反 | -0 |
补码 | 0000 0001 | 1111 1111 | 正数与原码相同,负数在反码的基础上+1 | 0 |
移码 | 1000 0001 | 0111 1111 | 在补码的基础上符号位取反首位0为负1为正 | 0 |
如果原码直接参与运算得出的数值与实际数值相去甚远,反码略有接近但是仍然有差别,最后补码完全相等 。
各类运算都可以使用补码进行,补码的出现可以使符号位一起参与运算,简化运算,使运算部件的设计更简单;还能使减法运算转化为加法运算进一步简化运算器的线路设计。在计算机内部常采用补码表示和运算数据,采用补码可以简化计算机运算部件的设计。
移码的出现是为了保证准确度(略有复杂其实我也说不明白)可以想象一个数轴,如果像原码、反码、补码一样,符号位为0代表正数为1代表负数,那么数轴上负数反而在正数右边,如此表示略显混乱,所以移码将最高位取反,移码在数轴上表示出来就是大家所熟知的负数在左侧正数在右侧。
以数字0为例,分+0和-0
+0 | -0 | ||
原码 | 0000 0000 | 1000 0000 | 数字的二进制形式,最高位是符号位0为正1为负 |
反码 | 0000 0000 | 1111 1111 | 正数与原码相同,负数符号位不变其余位取反 |
补码 | 0000 0000 | 0000 0000 | 正数与原码相同,负数在反码的基础上+1 1111 1111 + 1 = 1 000 0000溢出一位舍去有效值为0000 0000 |
移码 | 1000 0000 | 1000 0000 | 在补码的基础上符号位取反 |
取值范围
码制 | 定点整数 | 当n=8 | 定点小数 | 当n=8 |
原码 | -( | -127~127 | -( | |
反码 | -( | -127~127 | -( | |
补码 | -( | -128~127 | -1~( | -1~ |
移码 | -( | -128~127 | -1~( | -1~ |
补码的取值范围与原码、反码不同,由上表中+0和-0的数据表示可以看出,原码、反码所表示的+0和-0不同,因此在原码、反码的表示中+0和-0表示为两个数字,而在补码中,+0和-0的数值完全一致,因此补码中+0和-0合并表示为0,因此节省出的一个数的位置可以多表示一个数。
三、浮点数的表示及运算
表示
浮点数的表示与数学中的科学计数法基本一致。
运算
差不多就是科学计数法换个名字
对阶:令指数相等,一般来说对阶是将指数小的向指数大的看齐,在一定程度上可以省去后续步骤结果格式化。
尾数计算:该加加该减减容易得很。
结果格式化:结果要求小数点左边不为0且只能是个位数。
四、计算机结构
主机
此处提到的主机主要是指CPU和主存储器两部分,其余硬盘、声卡、显卡等统称为外设。
Flynn体系结构
控制部分 | 处理器 | 主存模块 | 特性 | 示例 | |
单指令流单数据流 SISD | 1 | 1 | 1 | 处理器系统 单片机多见,计算机少见 | |
单指令流多数据流 SIMD | 1 | 多 | 多 | 各处理器异步执行同一指令 | 阵列处理机(适用数组) 并行处理机 超级向量处理机 |
多指令流单数据流 MISD | 多 | 1 | 多 | 理论模型不切实际 | 有文献称流水线计算机为此类 |
多指令流多数据流 MIMD | 多 | 多 | 多 | 各级全面并行 | 多处理机系统、多计算机 (常见计算机) |
CISC和RISC
五、 流水线
流水线概念
以指令执行为例
指令执行分为三步:
读取指令------分析指令-------执行指令
在此过程中,同一时间内只有一个模块在工作,其余模块都在等待,一个指令完成后再进行下一个
流水线过程中,同一时间内每个模块都在工作,不停读取下一个,然后持续交付分析,不断执行
因此在流水线过程中,同一时间内对多条指令重叠执行操作,同时对各条指令的不同部分进行操作,提高各个模块的利用率和执行速度 。
流水线周期及执行时间计算
k为执行这项指令需要几部分;
t1,t2......tk为执行这k部分分别需要的时间;
n为执行多少条指令;
t(max)为执行指令这k部分需要的最长的一段时间,也称作流水线周期
理论公式:(t1+t2+t3+...tk)+(n-1)*t(max)
实践公式:(k+(n-1))*t(max)
例题:
若指令流水线把一条指令分为读取指令、分析指令、执行指令3部分,且3部分的时间分别是读取指令2s,分析指令2s,执行指令1s。那么流水线的周期是多少?100条指令全部执行完需要多少时间?
流水线周期为(也就是t(max)):2s
100条指令全部执行完需要多少时间:
按照理论公式:
(2s+2s+1s)+(100-1)*2s=203
按照实践公式:
(3+(100-1))*2s=204
注:若有考察两种公式不确定选哪个就看选项给了哪个
流水线的吞吐率计算
单位时间内流水线所完成的任务数量称为流水线的吞吐率
流水线吞吐率
指令条数 100
TP= ————————————————————— 以上题为例 TP= ————————————————
流水线的执行时间 203(或204)
流水线最大吞吐率(理想状态下)
1 1
TPmax= ———————————————— 以上题为例 TPmax= ——————————
函数周期(tmax) 2s
流水线的加速比计算
流水线的加速比
不使用流水线执行时间
S= ——————————————————————
使用流水线执行时间
以上题为例,不使用流水线的时间为(2s+2s+1s)*100=500
使用流水线的时间为 203(或204)
500
S= ——————
203
流水线的效率计算
流水线的效率是指流水线的设备利用率
例:
每个任务分为四部分,耗时分别为1t,1t,1t,3t,流水线连续执行四个这样的任务
下图中阴影1代表数据1执行的四个部分,S代表执行任务四个步骤所占用的空间,表示执行任务每个步骤所消耗的时间。
流水线的效率
n个任务占用的时空区
E = ——————————————————————————
k个流水段的总的时空区
n个任务所占用的时空区为:(1t+1t+1t+3t)*4=24t
k个流水段的总的时空区为:15t*4=60t
24t
S= ———————
60t
注:可理解为图表中阴影总面积与全部面积之比
注:
执行一条指令的周期是取指、分析、执行所需的时间。CPU会分阶段执行指令,例如取指阶段读到指令,在分析指令和执行指令阶段再去读入操作数。CPU也是根据指令周期的不同阶段区分指令和数据。
六、计算机层次结构化存储
计算机层次化结构存储是基于 存储速度、内存大小、成本高低等条件的综合性价比考量的结构理念。
Cache
存在于CPU与内存之间,提高CPU的输入输出速率,突破冯诺依曼瓶颈(即CPU与存储系统之间数据传送的带宽限制)
在计算机测存储体系中Cache是除寄存器外访问速度最快的层次
使用Cache改善系统性能的依据是程序的局部性原理
Cache相关计算
t1:表示Cache的周期时间
t2:表示主存储器的周期时间
h:表示对Cache的访问命中率,(1-h)表示失效率或未命中率
t3:表示Cache+主存储器的系统的平均周期
t3 = h*t1+(1-h)*t2
例如:Cache的访问命中率为 h=95%,Cache的周期时间为 t1=1s,主存储器的周期时间为 t2=1000s,Cache+主存储器的体统平均周期 t3 为?
t3=95%*1s+(1-95%)*1000s=50.95s
Cache的地址映像
全相联 | 主存内任何一块数据可调入Cache的任一块中 | 冲突最小 |
组相联 | 某一块只能存入同组号空间内,组内各块可任意存放 | 冲突次之 |
直接映像 | 主存的块只能放在Cache的相同块中 | 冲突最大 |
局部性原理
局部性原理分为 时间局部性 和 空间局部性
由上述可知,速度快的部件往往成本高所以一般只能用于操作小容量,例如寄存器。而存储容量大且成本低的部件往往速度慢,所以出于最佳性价比考虑,引入局部性原理,将需要频繁访问的局部调到速度快的部件中参与快速运算,以此提高效率。
时间局部性:例如循环体中,条件部分需要频繁执行,所以将其放入Cache中快速调取参与计算以提高效率。
(可理解为刚刚访问完的部分后面需要紧接着多次访问)。
空间局部性:例如数组 a[ ] 中,将数组 a[ ] 初始化,将a[0]初始化后紧接着需要将a[1],a[2],a[3]等紧邻部分分别初始化,
(可以理解为访问部分空间后紧接着访问多个邻近空间)。
工作集理论:进程运行时被频繁访问的部分集合,即将频繁运行的部分打包调入高速运算存储中短时间内不被替换
七、主存(内存/主存储器)
虚拟存储由主存和辅存构成。
编址
将单个存储器组成相应大小的存储器(什么规格的存储器,需要多少块,组成多大的存储器)
例题
内存地址从AC000 H到C7FFF H,共有__112___K个地址单元,如果该内存地址按字(16bit)编址,由28片存储器芯片构成。已知构成此内存的芯片每片16K个存储单元,则该芯片每个存储单元存储__4___位。
解:
此题中AC000 H,C7FFF H为地址编号
求地址单元个数(存储单元个数)= (最大地址编号+1)- 最小地址编号
地址单元个数 = (C7FFF+1) - AC000 = C8000-AC000 = 1C000 H(十六进制运算)
1C000(十六进制)=1 * +C *
=1*65536 + 12 * 4096 = 114688(十进制)
注:题中单位是K需进行转化 114688 B / 1024 = 112K
地址单元个数 = 112K
内存有112K个存储单元,每个存储单元字长是16bit(即编址内容为16)
题中需求存储器总容量=存储单元个数*编址内容 = 112K*16
设每片存储器芯片存储单元有x位(xbit)
此存储器芯片每片16K个存储单元
一片存储器芯片总容量=存储单元个数*编址内容=16K*x
28片存储器芯片总容量=28*16K*x
自题目中知:题中需求芯片由28片16K*x容量的存储器芯片构成,所以
题中需求存储器总容量=28片存储器芯片总容量
即112K*16=28*16K*x
解得x=4
八、磁盘工作原理
存放在磁盘中的文件需要进行编目,系统为每一个文件建立目录项用来描述和控制文件的数据结构。
磁盘结构
磁盘是环形盘片,上涂特殊材质用来保存数据,每片磁盘上有多条磁道,每条磁道分多个扇区,一般是多个磁盘叠状存在,磁盘只存储数据。
读取数据
数据读取需要用磁头伸向盘面,挪动到相应的磁道,相应扇区。
读取数据的时间 = 寻道时间 + 等待时间
寻道时间
磁头挪动到相应的磁道需要时间,这段时间称为寻道时间
旋转延迟时间(等待时间)
当读取信息时,磁头首先需要挪动到相应的磁道,然后需要定位到相应的扇区才能读取相应的信息,磁头定位到磁道之后,磁盘旋转到相应的扇区所需要的时间称为旋转延迟时间(等待时间)。
磁头定位到相应的扇区时,有可能恰巧定位到想要读取的信息所在的扇区,有可能需要磁盘转一圈才能定位到,所以一般取磁盘转一圈的时间为等待时间。
等待时间=平均定位时间+转动延迟(我没看懂可以忽略,就用磁盘旋转一圈的时间作为等待时间)
例题
每个磁道划分为11个物理块即11个扇区
磁盘旋转周期是33毫秒,磁道分为11个扇区,可知旋转每个扇区需要3ms,即读取每个扇区需要3ms
磁头在R0开始处
单缓冲区:只有一个缓冲区,每次只能读取一个扇区的数据放到缓冲区,等该数据在缓冲区处理完毕后再读取下一个扇区的数据,(注:在此过程中磁盘始终转动不停)
每个记录处理时间为3ms:即缓冲区处理时间为3ms
解析:
读取扇区R0的数据需要3ms,读完扇区R0之后,磁盘指针转动到R1的开始并持续转动,同时将读到的数据放到缓冲区,
缓冲区处理数据需要3ms,但是处理数据的3ms磁盘转动不停,
已知旋转每个扇区需要3ms,
所以当缓冲区处理完数据再准备读取数据时,磁头已经转动到了R2的开头,
而此时磁头想要读取的数据是R1,所以磁头只能等待,等磁盘转动接近一圈,转到R1的开头再开始读取
所以从读取扇区R0开始,到磁盘转动到扇区R1开头准备读取R1所消耗的时间就是处理整个R0所需要的时间
读取R0时间3ms + 磁盘从R1开始再次转动到R1开始的时间即磁盘转动一周的时间(33ms) = 36ms
(注:缓冲区处理数据的3ms与磁盘转动的时间重合)
后面读取R1-R9所需要的时间都是相同的,
只有R10所需要的时间是 读取扇区R10所需的时间3ms+缓冲区处理扇区R10所需要的时间3ms
所以处理11个记录的时间是(3ms+33ms)*10+(3ms+3ms)= 366ms
对存储信息进行优化可将其优化为
优化后不需要等待磁盘旋转 ,读取完R0之后,放置到缓冲区处理3ms,此3ms磁盘刚好旋转到R1开始位置可以读取R1,所以此时读取R0并处理R0所需要的时间是
3ms读取时间+3ms处理时间 = 6ms
后面R1-R10都是如此,所以优化后处理11个记录的时间是
(3ms+3ms)*11 = 66ms
独立磁盘冗余阵列RAID
RAID0 | 没有校验功能,利用率最高 |
RAID1 | 利用率50%,安全性相对好,至少需要2块硬盘,不同的两块磁盘写相同的数据 |
九、总线
总线是一个通用的数据传输通道,发送数据时采用分时机制,接收数据时可以同时接收。
内总线与外总线
内总线PCI,外总线SCSI,均是并行传输。
相关计算
总线频率=时钟频率/A(A总线传送一次数据所需要的时钟周期数);
总线带宽=总线宽度x总线频率;
十、系统可靠性分析
串联
特点:
n个子系统串在一起形成了一个大的系统,所有子系统必须正常运行整个系统才能正常运行,只要有一个子系统出现问题,整个系统都会出现问题。
计算:
系统的可靠度:
假设一个子系统的可靠度是R,第一个系统的可靠度是R1,第二个系统的可靠度是R2,依次类推到Rn,如果需要计算整个系统可靠性那么大致的思路是:
首先要R1可靠,然后在R1的基础上R2需要可靠,在R1,R2的基础上R3需要可靠,以此类推到Rn,所以整个系统的可靠性是每个子系统的可靠性相乘。R=R1*R2*R3......*Rn
系统的失效率
失效率的计算是每个子系统的失效率的和,子系统的失效率=(1-子系统可靠度)是近似的、大致的并不准确
例如20个子系统可靠度是90%此时子系统的失效率是10%,那么整个系统的失效率是200%是不准确的
并联
特点:
并联系统是n个子系统并联在一起,只要有一个子系统可以正常运行那么整个系统就能正常运行,若使系统不能正常运行需要n个子系统全部失效。
计算:
可靠度:
当所有子系统全部失效时,系统才能失效,所以求解系统的可靠度的思路是:
首先要R1失效,然后在R1失效的基础上R2需要失效,在R1,R2失效的基础上R3需要失效,以此类推到Rn,所以整个系统的失效率是每个子系统的失效率相乘。整个系统的可靠度 = 1-(整个系统的失效率)。
假设每个子系统的可靠度是R1,R2,R3......Rn;那么其对应的失效率是(1-R1),(1-R2),(1-R3)......(1-Rn)
整个系统的可靠度是 R = 1 - [(1-R1)*(1-R2)*(1-R3)......*(1-Rn)]
失效率:
用1减去求得的整个系统的可靠度:系统的失效率=1-R
n模冗余模型
特点:
R1-Rn多个子系统单独处理相同运算,将结果全部输送到表决器,表决器用少数服从多数标准取其中占大多数的结果,舍弃少数结果,如此,若其中有个别系统出错也不会影响正确结果输出,以此来提高可靠度。
计算:
难记、少用且不咋考,忽略
可靠性分析常考题型:
考题中常见串并联结合考察
解题思路是从整体看是并还是串,明显上图中大结构是串联,那么解题方式就是将两个小段的并联的可靠度求出来,然后再按串联处理。
中间并联:R中=1 -[(1-R)*(1-R)*(1-R)]
右侧并联:R右=[1 -(1-R)*(1-R)]
R总=R左*R中*R右。
十一、校验码及其计算
码距:
一个编码系统的码距是整个编码系统中任意两个码字的最小距离,(可以理解为传输形式是几位码距就是几)
例:若我想要传输两个二进制数A=1,B=0;
当码距是1时的传输形式为A=1;B=0;
当码距是2时的传输形式为A=11;B=00;
当码距是3时的传输形式为A=111;B=000;
由上可见,(通讯链路相对靠谱一般只会错一位不会错多位)
当码距为1时,则会用一位数1直接传输,即用1,0来传输若A,B,若通讯链路出现故障将1传输成0输出,此时根本无法判断最初传输的是A还是B,甚至根本无法判断传输是否出错。
检错:
当码距为2时,则会用两位数传递,即用A=11来传输A=1,用B=00来传输B=0,若通讯链路出现故障将11传输成10输出,此时可以判断通讯链路出现故障,即可以检错,但是仍无法判断是将A=11中的11传输成了10,还是将B中的00传输成了10,此时可以判断传输出错但是无法判断哪里出错无法纠正。
纠错:
当码距为3时,则会用三位数传递,即用A=111来传输A=1,用B=000来传输B=0,若通讯链路出现故障将111传输成110输出,此时可以判断通讯链路出现故障,即可以检错,且可以明确判断是将111传输成了110,进而可以将110纠正为111保持结果正确,即纠错。
码距与检错、纠错的关系:
检错:
在一个码组内为了可以将a位二进制的误码检错,要求最小的码距应该是 d>=a+1
即若需将1位二进制误码检错则需要码距为d=1+1=2
纠错:
在一个码组内为了可以将b位二进制误码纠错要求最小码距应该是 d>=2b+1
即若需将1位二进制误码纠错则需要码距为d=2*1+1=3
奇偶校验
只能检验错误但是无法确定是哪一位出错,更无法进行修改。
奇校验
添加一位校验位,保证二进制数据中1的个数是奇数个
偶校验
添加一位校验位,保证二进制数据中1的个数是偶数个
循环校验码CRC
特点:
只能进行检错不能进行纠错的编码
模2除法:
例题:
CRC编码编译过程:
首先看多项式,将多项式对应的二进制数求得,并明确其位数,设其位数位a位;
在原始报文后面缀上(多项式对应的二进制位数-1)个0,即(a-1)个0;
然后用原始报文后缀(a-1)个0做被除数,多项式对应二进制数做除数进行模2除法;
将模2除法所得的余数自右向左取(a-1)位,取代原来的(a-1)个0后缀到原始报文,得CRC编码;
校验:
将得到的CRC编码做被除数,将多项式对应的二进制数做除数进行模2除法,若余数为0则说明传输正确,若不为0则说明传输出错。
海明校验码
特点:
可以检错也可以纠错,海明校验码是奇偶校验码的一种扩充。
公式:
>=x+r+1 ,x表示所求信息的二进制位数,r表示校验码位数(r 是满足公式的最小正数)
例子:
求信息1011的海明码
二进制位数4位,即x=4,已知需满足≥x+r+1即当 r=3 时有 8≥8,所以有3个校验位。
校验位位置:
校验位的位置是固定的,,
,
,
......
如果有2位校验位那么就分别放在第 ,
位上。
如果有3位校验位那么就分别放在 第,
,
位上。
校验位数值计算:
由上可知,信息1011有4位,则有3个校验码,校验码分别在第1,2,4位上,所以信息只能放在第3,5,6,7位上如图所示:
第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 位数 |
1 | 0 | 1 | 1 | 信息位 | |||
r2 | r1 | r0 | 校验位 |
首先用 相加表示出信息位所在的位置,然后根据校验码所在的位置,对应找到各信息位,用信息位上的二进制数进行异或运算:
信息位分别是3,5,6,7位:
第3位的位置可以表示为:3=+
第5位的位置可以表示为:5=+
第6位的位置可以表示为:6=+
第7位的位置可以表示为:7=+
+
已知3个校验码分别在第1,2,4位上,也就是第,
,
;位上;
r0 对应在 位上,则上面有
的是第 7,5,3位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r0 = 11
1=1
r1 对应在 位上,则上面有
的是第 7,6,3位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r1= 10
1=0
r2 对应在 位上,则上面有
的是第 7,6,5位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r2= 10
1=0
所以三位校验位的值是001
第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 位数 |
1 | 0 | 1 | 1 | 信息位 | |||
0 | 0 | 1 | 校验位 |
正确的海明校验码是1010 101。
若传输过程中出错,假定只有一位出错;
错误示例1
例如:
接收到为1110 101
7位海明码根据公式 >=x+r+1 可知有3位校验位,且位置固定,则很容易知道校验码是001
那么剩余的就是信息位,信息位是1111。
根据上述求校验码的方式重求校验码:
r0 对应在 位上,则上面有
的是第 7,5,3位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r0 = 11
1=1
r1 对应在 位上,则上面有
的是第 7,6,3位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r1= 11
1=1
r2 对应在 位上,则上面有
的是第 7,6,5位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r2= 11
1=1
得此时得校验码是111(按照r2、r1、r0)
将新得到的校验码各位分别于原校验码取异或
r2 | r1 | r0 | 位置 |
0 | 0 | 1 | 原校验码 |
取异或运算 | |||
1 | 1 | 1 | 新校验码 |
1 | 1 | 0 | 结果110对应的十进制是6则表示第6位出错,将第6位取反就能得到原来正确的信息 |
接收到为1110 101第6位取反1010 101即正确的海明码。
错误示例2
例如:
接收到的
接收到为1010 100
7位海明码根据公式 >=x+r+1 可知有3位校验位,且位置固定,则很容易知道校验码是000
那么剩余的就是信息位,信息位是1011
根据上述求校验码的方式重求校验码:
r0 对应在 位上,则上面有
的是第 7,5,3位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r0 = 11
1=1
r1 对应在 位上,则上面有
的是第 7,6,3位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r1= 10
1=0
r2 对应在 位上,则上面有
的是第 7,6,5位,将这3位上的数值自左向右取异或运算(相同同取0不同取1)
r2= 10
1=0
得此时得校验码是001(按照r2、r1、r0)
将新得到的校验码各位分别与原校验码取异或
r2 | r1 | r0 | 位置 |
0 | 0 | 0 | 原校验码 |
取异或运算 | |||
0 | 0 | 1 | 新校验码 |
0 | 0 | 1 | 结果001对应的十进制是1则表示第1位出错,将第1位取反就能得到原来正确的信息 |
接收到为1010 100第1位取反1010 101即正确的海明码。
哈夫曼编码
哈夫曼编码通常给定一组字符并附带给各个字母出现的频率。
例
已知某文档包含五个字符,且字符出现的频率如下:
字符 | a | b | c | d | e |
频率 | 40 | 10 | 20 | 16 | 14 |
采取哈夫曼编码对该文档进行压缩存储,则单词“cade”的编码为( ),文档的压缩比为( )
先将频率从大到小排列:10、14、16、20、40;
构造哈夫曼树
构造方式:
依次选取最小的进行构造。虽然哈夫曼树没有明确要求,但是尽量小数在左子树,大数在右子树。
最后自底端向顶端,左子树标为0,右子树标为1;
此时,字符的编码分别为:
字符 | a | b | c | d | e |
频率 | 0 | 100 | 111 | 110 | 101 |
所以,单词cade的编码为111 0 110 101;
在哈夫曼编码中,编码个数n的求解方式为:字符数量<
即本题中字符数量为5,则编码个数为3;
文档的压缩比公式是:(编码个数-加权平均长度)/编码个数
加权平均长度:字符路径长度*出现频率
1*40%+3*10%+3*20%+3*20%+3*16%+3*14%=2.2
故文档的压缩比为 :(3-2.2)/3≈27%
十二、指令系统简介
指令系统是CPU的根本属性,一般包括以下两部分:
操作码
主要指明操作的类型
地址码
指明操作数以及运算结果存放的地址
寻址方式
寻址方式 | 指令需要的操作数不在存储器中 | 速度 |
立即寻址 | 操作数作为指令的一部分直接写在指令中 | 最快 |
寄存器寻址 | 操作数在寄存器中 | 较快 |
直接寻址 | 指令中给出操作数的地址,根据地址去内存中读取 | 最慢 |
寻址方式 | 指令需要的操作数在存储器中 |
寄存器间接寻址 | 操作数有效地址用SI、DI、BX、BP四个寄存器之一来指定 |
寄存器相对寻址 | 有效地址是一个基址寄存器BX、BP或变址寄存器SI、DI的内容和指令的偏移量 |
基址加变址寻址方式 | 有效地址是一个基址寄存器BX、BP或变址寄存器SI、DI的内容之和 |
相对基址加变址寻址方式 | 有效地址是一个基址寄存器BX、BP的值、一个变址寄存器SI、DI的值和指令中的偏移量之和 |
十三、逻辑运算
运算符 | 描述 | 实例 | 结果 |
! | 逻辑非 | !a | 与a相反,若a是true那么!a是false反之亦然 |
&& | 逻辑与 | a&&b | a与b都是true那么结果就是true,如果二者有一个false那么结果就是false |
|| | 逻辑或 | a||b | a与b只要有一个是true那么结果就是true,如果两个都是false结果是false |
优先级:! > && > ||
&&应用
① 如果想要表达数学公式中 [5,6] 可以写作(a>=5&&a<=6)
注意:5<a<6的计算方式是首先判断5是否小于a得到结果(0或1)再与6比较,但是无论得到0或1都小于6所以此不等式的值始终是1
②可用来判断字母是否为大小写
c>='A'&&c<='Z'
||应用
a<0||a>99的意思是a不在0~99之间
!应用
!a<20中单目运算符的优先级高于双目运算符,所以计算过程是!a的结果再与20比较若a=0那么!a=1或a=1那么!a=0;不论是1还是0都小于20,所以该式结果恒等于1;如果想要表示a不小于20应该写为!(a<20)
逻辑运算是自左向右进行计算的,如果左边的结果可以确定计算的结果那么右边的不会再计算此现象称为短路
例如
a==1&&b==1,如果a==1是false那么不管b==1是true或者false此式子的结果都是0
所以在&&中一旦左边是false右边不会再进行计算
a==1||b==1,如果a==1是true那么不管b==1是true或者false此式子的结果都是1
所以在||中一旦左边是true右边不会再进行计算
算术左移
操作数各位依次向左移动n位,最低位补0。符号为<<; 相当于原数字乘以
算术右移
操作数各位依次向右移动n位,符号位不变。符号为>>; 相当于原数字除以