计算机组成原理--数制与编码(校验码,CRC,汉明码详解)

一、考纲

1. 数制与编码

  1. 进位计数制及其相互转换

  2. 真值和机器数

  3. BCD码

  4. 字符与字符串

  5. 校验码 (汉明码,CRC校验等)

2.定点数的表示和运算

  1. 定点数的表示(无符号数的表示,有符号数的表示)

  2. 定点数的运算

    • 定点数的移位运算
    • 原码定点数的加/减运算
    • 补码定点数的加/减运算
    • 定点数的乘/除运算,
    • 溢出的概念和判别方法。

3.浮点数的表示和运算

1.浮点数的表示(IEEE 754标准)

2.浮点数的加/减运算

4.算术逻辑单元(ALU)

1.串行加法器和并行加法器

2.算术逻辑单元的功能和结构


正文👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇





二、数制与编码

1.进制及其转换:

常见数制类型及表示方法

  1. 十进制(Decimal)
    数码 :0 1 2 3 4 5 6 7 8 9
    书写方式 :
    1. 123456
    2. ( 123456 ) 10 (123456)_{10} (123456)10
  2. 二进制(Binary)
    数码 :0 1
    书写方式 :
    1. 101011B
    2. ( 101011 ) 8 ( 101011)_{8} (101011)8
  3. 八进制(Octal)
    数码 :0 1 2 3 4 5 6 7
    书写方式 :
    1. 123456Q
    2. ( 123456 ) 8 (123456)_{8} (123456)8
  4. 十六进制(Hexadecimal)
    数码 :0 1 2 3 4 5 6 7 8 9 A B C D E F
    书写方式 :
    1. 1234A56CH
    2. ( 1234 A 56 C ) 16 (1234A56C)_{16} (1234A56C)16
    3. 0x1234A56C
1.非十进制数转换成十进制数

前置概念----权值:
权值”是指对应数值位的进制幂次方数,如二进制整数中第0位(最低位,也就是整数最右边的那位)的权值是2的0次方,第1位的权值是2的1次方,以此类推;同理在八进制整数中第0位的权值是8的0次方,第1位的权值是8的1次方……,以此类推。

  1. 二进制转换为十进制
    各位值乘以位权值相加即可。
    例:
    1011 0 2 – > 1 ∗ 2 4 + 0 ∗ 2 3 + 1 ∗ 2 2 + 1 ∗ 2 1 + 0 ∗ 2 0 10110_2–>1*2^4+0*2^3+1*2^2+1*2^1+0*2^0 101102>124+023+122+121+020
  2. 八进制转换为十进制
    与二进制类似(将底数2改为8即可)
  3. 十六进制转换位十进制
     与二进制类似(将底数2改为16即可)
2.十进制数转换成非十进制数
  1. 十进制整数转换为二进制
     除2取余(先出来的余数是二进制的低位)
     
    在这里插入图片描述

  2. 十进制小数数转换为二进制
     乘2取整(先出来的是高位)
     在这里插入图片描述
    要记住的一些特殊数字

    进制分数十进制小数二进制
    1 2 \frac{1}{2} 210.50.1
    1 4 \frac{1}{4} 410.250.01
    1 8 \frac{1}{8} 810.1250.001
    1 2 n \frac{1}{2^n} 2n10.00…n个0…1
  3. 十进制转换为八进制,十进制转换为十六进制都与二进制类似,跳过。

3.  八进制数、二进制数互转

八进制数转换成二进制数
每一位8进制数换成对应的3位2进制数表示即可

在这里插入图片描述
 二进制转换为八进制数在这里插入图片描述

3.  十六进制数、二进制数互转

十六进制数转换成二进制数
   类似于八进制数转换为二进制数(将3位改为4位即可)
  
二进制数转换为十六进制数
  类似于二进制数转换为十六进制数(将3位改为4位即可)

2.真值和机器数的互换

用“+”、“-”号加绝对值来表示数值的大小,用这种形式表示的数值在计算机中称为“真值”
符号数码化后,二进制数的最高位“0”表示正号,“1”表示负号,用这种形式表示的数值在计算机中称为“机器数”

注:在计算机编程中

int a;  //申请了一个32内存空间,这个空间的地址叫a;
		//也告诉了计算机把这个数当作有符号的数来看待,计算机会把它当作补码使用。
a=-5;  //计算机会存储 1011 即补码
原码,补码,反码,移码
1.原码:符号位+绝对值的二进制(方便读取)
2.补码:正数的补码等于原码(方便运算)
           负数:除符号位外,各位取反末位加1
3.反码:正数的反码等于原码(没用)
           负数:除符号位外,各位取反
4.移码:补码符号位取反
5.8421CD码与余三码
真值8421BCD余三码
000000011
100010100
200100101
300110110
401000111
501011000
601101001
701111010
810001011
910011100

8421BCD用于表示字符型数据:电话号码、学号等,不用于运算

大小比较:
原码:正数越大值越大,负数越大值越小
移码:看着越大值越大

6.字符与字符串

ASCII码

如a至z,A至Z,=,空格,0至9等等。
字符总数不超过256,所以可以用8个2进制表示。
在这里插入图片描述

输入码:音码(汉语拼音) 和形码 (五笔输入法)
区位码

区位码是一个四位的十进制数,前两位叫做区码(01-94),后两位叫做位码(01-94)。汉字与符号组成一个94×94的矩阵。在此方阵中,每一行称为一个“区”,每一列称为一个“位”。
每个区位码都对应着一个唯一的汉字或符号。比如:“2901”输入“健”字,“4582”输入“万”字。

国标码:

区位码是一个四位的十进制数,国标码是一个四位的十六进制数。为了和ASCII码兼容,汉字输入区位码与国标码有一个简单的转换关系
方法:
(1)区位码先转换成十六进制数表示
(2)(区位码的十六进制表示)+2020H=国标码;
举例:以汉字“大”为例,“大”字的区内码为2083
1、区号为20,位号为83
2、将区位号2083转换为十六进制表示为1453H
3、1453H+2020H=3473H,得到国标码3473H

机内码

汉字或字符在计算机内部的表示就是机内码
国标码+8080H=机内码
以汉字“大”为例:
“大”字的区位码为2083(十进制数),“区”和“位”分别换算成十六进制是1453H(20→14H,83→53H)
1453H+2020H=3473H,得到“大”字的国标码是3473H
3473H+8080H=B4F3H,得到“大”字的机内码是B4F3H

字体库 (了解 即可)

字形码,点阵代码的一种。为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码)。
用于显示的字库叫显示字库。显示一个汉字一般采用16×16点阵或24×24点阵或48×48点阵。已知汉字点阵的大小,可以计算出存储一个汉字所需占用的字节空间。
例:用16×16点阵表示一个汉字,就是将每个汉字用16行,每行16个点表示,一个点需要1位二进制代码,16个点需用16位二进制代码(即2个字节),共16行,所以需要16行×2字节/行=32字节,即16×16点阵表示一个汉字,字形码需用32字节。
即:字节数=点阵行数×点阵列数/8
用于打印的字库叫打印字库,其中的汉字比显示字库多,而且工作时也不像显示字库需调入内存。
全部汉字字形码的集合叫汉字字库。汉字库可分为软字库和硬字库。软字库以文件的形式存放在硬盘上,现多用这种方式,硬字库则将字库固化在一个单独的存储芯片中,再和其它必要的器件组成接口卡,插接在计算机上,通常称为汉卡。
可以这样理解,为在计算机内表示汉字而统一的编码方式形成汉字编码叫内码,内码是惟一的。为方便汉字输入而形成的汉字编码为输入码,属于汉字的外码,输入码因编码方式不同而不同,是多种多样的。为显示和打印输出汉字而形成的汉字编码为字形码,计算机通过汉字内码在字模库中找出汉字的字形码,实现其转换。
                                                                                                              -------------摘自百度百科

7.校验码

数据再计算机传输过程中会出现错误,错误会引起歧义,所以需要校验码。
码距是指两个码组对应位上数字的不同位数称为码组的距离,又称为汉明距离。码距为1时不具备校验能力。
通信双方的大工程某种共识:校验方法、校验位数、校验位置

1.奇偶校验码

以奇校验码为例:
最高位为校验位,最高位补0或1是校验码中1的个数为奇数。

数据:01010101
发送方:奇校验  1 010101011的个数右奇数个)
接收方:
没错:101010101----01010101(去掉校验位)
1位错:11 1101010120 010101011的个数为偶数了,可以检验到错误)
2位错: 1 10010101(此时1的个数为奇数,不能检验到错误)

优点:简单,传输效率高
缺点:只能发现错误,不能修改错误;只有当奇数个位数出错时才能被发现。

2.Hamming校验码
发送方:

1.校验位的位数

  1. 仅能发现并修正一位错
    假设数据位D(d位),校验位R(r位)
    2 r > = d + r + 1 2^r>=d+r+1 2r>=d+r+1
  2. 发现修正一位错,并发现两位错
    2 r − 1 > = d + r 2^{r-1}>=d+r 2r1>=d+r

2.校验位的位置
第一种:仅能发现并修正一位错
海明码的下标为 2 i 2^i 2i的位置上,剩余依次填上数据位即可。
设数据位d=8,推出r=4
假设数据串位10100101

H12H11H10H9H8H7H6H5H4H3H2H1
D8D7D6D5R4D4D3D2R3D1R2R1
10100101

第二种: 发现修正一位错,并发现两位错
海明码的下标为 2 i 2^i 2i的位置上以及最高位,剩余依次填上数据位即可。
设数据位d=8,推出r=5

H13H12H11H10H9H8H7H6H5H4H3H2H1
1312=4+811=1+2+810=2+89=1+887=1+2+46=2+45=1+443=1+221
10100101

3.校验位的值

  1. 确定校验关系:数据位在海明码中的下标=参与校验的校验位的下标和
H12H11H10H9H8H7H6H5H4H3H2H1
D8D7D6D5R4D4D3D2R3D1R2R1
12=4+811=1+2+810=2+89=1+887=1+2+46=2+45=1+443=1+221
10100101
  1. 确定校验位的值=它参与校验的数据位的亦或

    R1参与的校验:D1 D2 D4 D5 D7
    R2参与的校验:D1 D3 D4 D6 D7
    R3参与的校验:D2 D3 D4 D8
    R4参与的校验:D5 D6 D7 D8

    R1=D1^D2^D4^D5^D7=1^0^0^0^0=1
    R2=D1^D3^D4^D6^D7=1^1^0^1^0=1
    R3=D2^D3^D4^D8=0^1^0^1=0
    R4=D5^D6^D7^D8=0^1^0^1=0
    
H12H11H10H9H8H7H6H5H4H3H2H1
D8D7D6D5R4D4D3D2R3D1R2R1
12=4+811=1+2+810=2+89=1+887=1+2+46=2+45=1+443=1+221
101000100111

第一种与第二种的区别是是否有R5,R5是(所有数据位的异或)异或(不包括R5的所有校验位的异或)

R5=R1^R2^R3^R4^D1^D2..^D8=0
H13H12H11H10H9H8H7H6H5H4H3H2H1
R5D8D7D6D5R4D4D3D2R3D1R2R1
1312=4+811=1+2+810=2+89=1+887=1+2+46=2+45=1+443=1+221
0101000100111
接收方:
S1=R1'^(D1'^D2'^D4'^D5'^D7')
S2=R2'^(D1'^D3'^D4'^D6'^D7')
S3=R3'^(D2'^D3'^D4'^D8')
S4=R4'^(D5'^D6'^D7'^D8')

第一种

  1. 没有发生错误S1=0 S2=0 S3=0 S4=0
  2. 发生一位错误:
    假设D1发生错误,
    S1=1
    S2=1
    S3=0
    S4=0
    S4 S3 S2 S1=0011 =10进制的3 恰巧D1的下标就是3

第二种

S1=R1'^(D1'^D2'^D4'^D5'^D7')
S2=R2'^(D1'^D3'^D4'^D6'^D7')
S3=R3'^(D2'^D3'^D4'^D8')
S4=R4'^(D5'^D6'^D7'^D8') 
//前面一样
S5=R5^(D1^...^D8)(R1^...^R5)
  1. 没有错误 S5=0 S4 S3 S2 S1=0000
  2. 发生一位错
    I.D2出错 S5 =1 S4S3S2S1=0101=5->H5,即出错位置在汉明码的下标
    II. D5出错 S5 =1 S4S3S2S1=1001
    III.校验位R1出错 S5 =1 S4S3S2S1=0001
  3. 发生两位错:
    设数据位D1和D3出错:S5 =0 S4S3S2S1=0101

知识点补充(贼TMD重要)
海明码如果要检测出N位错误,需要一个海明距为N+1的方案,要纠正D位错误需要2N+1的编码方案。
海明距:某编码长度中码距最小的为海明距
我们给出一个公式: L-1=D+C 其中(L位海明距,D为检查出错误位数,C为纠错位数,且C恒≤D,因为海明码的纠错能力恒小于检错能力)
假设要纠正C位错误,那么D最小等于C所以有L-1=C+C L=2*C+1,假设要发现D为错误,C最小等于0则有L-1=D L=D+1,正好是最开始的那句话。

3.CRC 循环冗余校验码

模2运算

  1. 模2加减运算即异或运算
    用的时候直接亦或就好了,相同取0,不同得1

  2. 模2除法运算:
    依托模2减法。根据被除数或者余数的最高位决定是否做模2减法,如果最高位1则做模2减法,否则不做减法
    在这里插入图片描述
    我们没必要管商是多少,只需要知道最后的余数是多少即可。
    生成多项式 G ( x ) = a X 3 + b X 2 + c X + d G(x)=aX^3+bX^2+cX+d G(x)=aX3+bX2+cX+d
    生成多项式是一串二进制编码,G。
    生成多项式和除数是一一对应,事先选定的。
    假设数据位为D(位数为d),G位数为r+1位

发送方:
4. 将D左移r位,低位补0,形成d+r位信息位M
5. M模2除G,得到商和r位余数
6. 生成CRC编码=M+余数
接收方:
CRC编码模2除G=(M’+余数’)/G
没有错误:余数为0,M’=M 余数’=余数
(M’+余数’)/G=(M+余数)/G=M/G+余数/G=商+余数/G+余数/G=商+(余数+余数)/G=商
如果出错:根据余数情况修改或者判断错误

示例:

现假设选择的CRC生成多项式为 G ( X ) = X 4 + X 3 + 1 G(X) = X^4 + X^3 + 1 GX=X4+X3+1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:
①将多项式转化为二进制序列,由 G ( X ) = X 4 + X 3 + 1 G(X) = X^4 + X^3 + 1 GX=X4+X3+1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001
②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。
③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。
④接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。

因为太长了,我们分量部分发。
因为太长了,我们分量部分发。
因为太长了,我们分量部分发。
因为太长了,我们分量部分发。
为了你们阅读体验。

风骨散人Chiam CSDN认证博客专家 拖更专业户????
大学僧,考研狗,没上岸,ACM退役选手。
名字的含义:希望可以通过努力,能力让家人拥有富足的生活而不是为了生计而到处奔波。“世人慌慌张张,不过是图碎银几两。偏偏这碎银几两,能解世间惆怅,可让父母安康,可护幼子成长 …”Chiam是 -am爱 China中国
文章主要内容:
Python,C++,C语言,JAVA,C#等语言的教程,
ACM题解、模板、算法等,主要是数据结构,数学和图论
设计模式,数据库,计算机网络,操作系统,计算机组成原理,Python爬虫、深度学习、机器学学习,
计算机系408考研的所有专业课内容。
目前还在更新中,博客园,微信公众号同名“风骨散人”,关注公众号可获软件大礼包
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页