举个例子:比如一共有8位,码距为1则检查不出任何错误,因为所有编码都是合法编码。如果码距为2,那合法编码应该像 00000000,00000011,00001100,00001111这样,那如果出现00000001这样的非法编码就出错了,可检查一位错,但如果两位同时错了,则有可能又跳到另一个合法编码上了,就检查不出2位错。
那如果码距是3,那合法编码应该像 00000000,00000111,00111000,00111111 这样,那如果出现一位错 00000001,或者两位错00000011,都是非法编码,都能检查出错误,并且此时可以纠正00000001为00000000,纠正00000011为00000111。但是三位同时错就检查不出了。
常见校验策略:奇偶校验,CRC校验,海明校验
ps:海明编码最强视频演示教程:https://www.youtube.com/watch?v=373FUw-2U2k
三、运算方法与运算器
1. 定点数运算及溢出
定点数加减法:减法化加法,用补码直接相加,忽略进位
溢出:运算结果超出了某种数据类型的表示范围
溢出检测方法:统一思想概括为正正得负或负负得正则溢出,正负或负正不可能溢出
方法1:V = XYS + XYS(XY为两个加数的符号位,S为结果的符号位,_表示非),那么V = 1则为溢出
方法2:V = C0 ⊕ C1(C0是最高数据位产生的进位,C1是符号位产生的进位),那么V = 1则为溢出
方法3:V = Xf1 ⊕ Xf2(数据采用变型补码 Xf1Xf2 X0X1X2X3… )
PS:以上方法都是利用正正得负负负得正则溢出为出发点的电路设计
2. 补码一位乘法——Booth算法
[x·y]补 = [x]补·( -y0+∑ yi2-i )
= [x]补·[ - _y_0 + _y_12-1 + _y_22-2 + … + _yn_2-n]
= [x]补·[ - _y_0 + (_y_1 - _y_12-1) + (_y_22-1 - _y_22-2) + … + (_yn_2-(n-1) - _yn_2-n)]
= [x]补·[(_y_1 - _y_0) + (_y_2 - _y_1) 2-1 + … + (yn - yn-1) 2-(n-1) + (0 - yn)2-n]
总结起来设计数字电路的规则就是:
-
为00或者为11的时候,直接右移一位
-
为01的时候,加x的补,然后右移一位
-
为10的时候,加-x的补,然后右移一位
PS:其实第一行和最后一行都能设计数字电路,为什么要从第一个式子推到最后一个式子呢?原因有两点:
1)二进制中如果有0,可以不进行运算
2)如果有连续的1可以减少计算次数,比如 a * 001111100 = a * (010000000 - 0000000100)
所以每次判断 yn+1 - yn就可以减少计算次数了
参考:https://www.cnblogs.com/xisheng/p/9260861.html
3. 定点数除法 — 略,没找到好的资料
4. 浮点数加减法
(1)求阶差,阶码小的对齐大的
(2)尾数加减
(3)结果规格化
四、存储系统
1. 存储系统层次结构
主存速度缓慢的原因:主存增速与CPU不同步,执行指令期间多次访问主存
主存容量不足的原因:
-
存在制约主存容量的技术因素:如由CPU、主板等相关技术指标规定了主存容量
-
应用对主存容量需求不断扩大:window98 – 8M,windows 8 – 1G
-----> 存储体系结构化层次: CPU – Cache1 – Cache2(解决速度) – 主存 – 辅存(解决容量)
存储体系结构化层次理论基础:
-
时间局部性:程序体现为循环结构
-
空间局部性:程序体现为顺序结构
2. 主存中的数据组织
存储字长:主存的一个存储单元所包含的二进制位数,目前大多数计算机主存按字节编址,主要由32为和64位
数据存储与边界的关系:
-
按边界对齐的数据存储,未按边界对齐的数据存储
-
边界对齐与存储地址的关系:(32位为例)
-
双字长边界对齐:起始地址最末三位为000(8字节整数倍)
-
单字长边界对齐:起始地址最末二位为00(4字节整数倍)
-
半字长边界对齐:起始地址最末一位为0(2字节整数倍)
大端与小端存储方式:
-
大端:最高字节地址是数据地址(0123存成0123