第二章 数据的表示、运算与校验#
目录#
1. 数制转换#
1.1. 十进制转二进制#
整数部分:除积其余法
小数部分:乘基取余法
整数表示为,小数表示为
1.2. 二进制转十进制#
整数部分
逐次乘基相加法,从高位向低位
小数部分
逐次除基相加法,从低位向高位
2. 原码、补码与反码#
原码
1位符号位+二进制数
补码
方便运算,可由原码按位取反后加1计算补码,重复步骤将补码可以转回原码。
反码
原码按位取反,相对于补码少了加1运算。
移码
移码通常用来表示浮点数的阶码。它只能表示整数。
移码就是在真值 上加上一个常数(偏置量),通常这个常数取 ,相当于 在数轴上向正方向偏移了若干单位,这就是”移码“ 一词的由来。移码定义为
其中机器字长为
例如,若正数 ,,字长为8位,则其移码表示为 ,
移码具有以下特点:
- 移码中零的表示唯一
3. 数制转换#
3.1. 二进制转八进制和十六进制#
3.2. 任意进制转为十进制#
3.3. 十进制转换为任意进制#
示例:将十进制数 转换为二进制数。
3.3.1. 除基取余法(整数部分的转换)#
整数部分除基取余,最先取得的余数为数的最低位,最后取得的余数为数的最高位(即除基取余,先余为低,后余为高),商为0时结束。
最低位为
最高位 为
3.3.2. 乘基取余法(小数部分的转换)#
小数部分乘基取整,最先取得的整数为数的最高位,最后取得的整数为数的最低位(即乘基取整,先整为高,后整为低),乘积为(或满足精度要求)时结束。
取整 为 最高位为
取整 为
取整 为
取整 为 最低位为
因此小数部分 ,所以
4. 运算方法#
4.1. 定点加减运算#
4.2. 溢出的判断与移位#
4.3. 定点乘法运算#
4.4. 定点除法运算#
4.5. 浮点四则运算#
5. 校验码#
5.1. 奇偶校验码#
奇校验:整个校验码(包含有效信息位和校验位)中 的个数为奇数
偶校验:整个校验码(包含有效信息位和校验位)中 的个数为偶数
5.2. 海明校验码#
求 的海明码
5.2.1. 确定海明码的位数#
设 为有效信息的位数, 为校验位的位数,则信息位 和校验位 应满足
中 ,则 可满足要求。
5.2.2. 确定校验位的分布#
规定校验位 在海明位号为 的位置上,其余各位为信息位。
的海明号位为
的海明号位为
的海明号位为
5.2.3. 分组形成校验关系#
被校验数据位的海明号位等于校验该数据位的各校验位海明位号之和。另外,校验位不需要再被校验。设 表示第 位信息位, 表示第 位海明码。。
放在 上,由 校验,
放在 上,由 校验,
放在 上,由 校验,
放在 上,由 校验,
5.2.4. 校验位取值#
校验位 的值为 组(由该校验位校验的数据位)所有位求异或。
5.2.5. 海明码的校验原理#
每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查,构成 个校验方程。
若 的值为 , 则说明无错。
否则说明出错,且出错位即为 指示的 十进制数。
5.3. 循环冗余校验码(CRC)#
的基本思想是:在 位信息码后再拼接 位校验码,整个编码长度位 位,因此又被称为 码。
将四位有效信息 编成循环校验码,选择生成多项式 。
,即 ,。
,即 ,。 表示 最高位次数。
生成多项式, 表示 ,,生成多项式共 位。
做模2除运算。即按位异或,结果不向上借位。
5.3.1. 译码和纠错#
备注 | 循环码(A7 - A1) | 余数 | 出错位 |
---|---|---|---|
正确 | 1100010 | 000 | 无 |
错误 | 1100011 | 001 | 1 |
错误 | 1100000 | 010 | 2 |
错误 | 1100110 | 100 | 3 |
错误 | 1101010 | 011 | 4 |
错误 | 1110010 | 110 | 5 |
错误 | 1000010 | 111 | 6 |
错误 | 0100010 | 101 | 7 |
我们可以采取一种节省硬件的纠错方法:
- 只设置余数 的译码输出,对应于最高位的出错位置;
- 如果校验后发现余数不为 ,一边对余数补 继续做模 除,同时将被检测码字循环左移一位,假设第 位出错,余数为 ;
- 当出现余数 时,出错位也被移至最高位位置,可用异或门将之变反纠正,或在移位过程中纠正;
- 继续移满一个循环,即余数 再次出现时,码字共移位了 次,我们将得到一个纠正后的正确码字。
情况说明 | 校验码当前情况 | 运算 | 余数 |
---|---|---|---|
发现出错,开始纠错 | 1100011 | 1100011与G(X)模二除 | 001 |
校验码循环左移,同时余数001补0,成为0010,与G(X) 模二除 | 1000111 | 0010与G(X)模二除 | 010 |
校验码循环左移,同时余数010补0,成为0100,与G(X) 模二除 | 0001111 | 0100与G(X)模二除 | 100 |
校验码循环左移,同时余数100补0,成为1000,与G(X) 模二除 | 0011110 | 1000与G(X)模二除 | 011 |
校验码循环左移,同时余数011补0,成为0110,与G(X) 模二除 | 0111100 | 0110与G(X)模二除 | 110 |
校验码循环左移,同时余数110补0,成为1100,与G(X) 模二除 | 1111000 | 1100与G(X)模二除 | 111 |
校验码循环左移,同时余数111补0,成为1110,与G(X) 模二除 | 1110001 | 1110与G(X)模二除 | 101 |
发现当前余数位101,已知101代表第一位出错,把第一位与1进行异或运算(或取反运算),纠错 | 0110001 | 无运算 | 无 |
校验码循环左移,同时余数101补0,成为1010,与G(X) 模二除 | 1100010 | 1010与G(X)模二除 | 001 |