数据的世界
在我们的日常生活中,我们通常使用十进制来表示数据,例如今天你在网上买了价值139元的鼠标。但在计算机中,数据以二进制形式存在,电脑本身也只能识别 0 和 1。下面我们就进入二进制的世界来一起学习。
二进制转化
1、二进制与十进制的相互转化
若需将二进制数转化为十进制数,只需按权相加
例如:
(111)2 = 22* 21* 20 = (7)10
如需将十进制数转化为二进制数,只需使用除基取余法,即对于十进制数进行除2操作,并记录余数,反复操作,直到除2为0为止,然后将所记录的所有余数逆向排列即得到二进制数
(9)10 = (1001)2
机器数
原码、反码、补码、移码
机器数由两部分组成:符号位和数值位
符号位:负数的符号位为0,正数的符号位为1
原码:负数的原码为符号位(0)+二进制数,正数的原码为符号位(1)+二进制数。
反码:负数的反码为原码按位求反,正数的反码为原码
补码:负数的补码为反码+1,正数的补码为原码(补码模的概念:符号位进位后所在的权值)
移码:数值位与补码数值位相同,符号位求反
浮点数
浮点数:一种小数点位置不固定,可随需要浮动的数
表示为:N = R^E *M (其中M是浮点阶码的底(隐含,与尾数的基数相同,通常取2),E称为阶码,M称为尾数)
浮点数代码由阶码和尾数两部分构成。阶码包括阶符和阶码数值部分,尾数包括数符和尾数数值部分。
阶码:常用补码或移码表示的定点整数。阶码的符号位为正,则表示尾数表示的定点小数的算数左移N位(小数点向右移N位);阶码的符号位为负,则表示尾数表示的定点小数的算数右移N位(小数点向左移动N位)。
尾数:常用原码或补码表示的定点小数。
阶码反映浮点数的表示范围和小数点的实际位置,尾数的位数反映浮点数的精度。
规格化
为了提高运算精度,充分利用尾数的有效位数,且确保任意一个数用浮点数形式表示时其尾数的代码具有唯一性,需要采用浮点数规格化形式。
浮点数规格化即规定尾数的最高数位必须时一个有效值。
规格化的浮点数的尾数的绝对值满足条件: 1/2 <= |M| <= 1
(1)原码规格化:
正数为:0.1……的形式,最大值表示为0.1……1,最小值表示为0.10……0
负数为:1.1……的形式,最大值表示为1.10……0,最小值表示为1.111……1
当浮点数运算结果为非规格化需进行规格化处理:将尾数算数左移一位(小数点右一位),阶码减一
当浮点数运算的结果尾数出现溢出(双符号位为01或10):将尾数算数右移一位(小数点左移一位),阶码加一
IEEE754标准
IEEF754标准规定常用的浮点数格式有:短浮点数、长浮点数、临时浮点数
IEEF754标准的浮点数(短浮点数和长浮点数)的尾数用采取隐藏位的策略的原码表示,阶码用移码表示
对于32位短浮点数,最高位是数符位,后八位为阶码,阶码用移码表示,实际偏移量为2^8-1 = 127。其余23位是原码表示的尾数数值位。其中,尾数的最高位总是‘1’,为了更高使尾数多表示一位有效值,将1隐含,所以实际上尾数有24位,隐藏的1是整数,23位尾数是纯小数。
例题:将十进制数20.59375转化成IEEE754标准的32位短浮点数
(20.59375)10 = (10100.10011)2
(10100.10011)2 = 1.010010011* 2^4
S0 = 0(正数) 阶码 = 4 + 127 - 131 = 10000011 尾数M = 01001001100……(隐含1,原码表示)
所以F = 0 10000011 01001001100……
校验码
1、奇偶校验码
奇校验码:通过在编码中增加一位校验码来使编码中1的个数为奇数
偶校验码:通过在编码中增加一位校验码来使编码中1的个数为偶数
奇偶校验码只能检测出奇数个错误(出现奇数个错误,编码中1的个数的奇偶性便会发生改变)
2、海明码
汉明码默认一串数据只错一位
海明码由校验位和数据位构成,在数据位之间的特定位置上插入k个校验位,通过扩大码距来实现检错和纠错。
设数据位为n位,校验位为k位,则n和k必须满足以下关系:2^k - 1 >= n+k。Di表示数据位数据、Pi表示校验位数据
校验位在海明码位的第2^(i-1)位置上
假设数据为:D7 D6 D5 D4 D3 D2 D1 D0 = 01101001
海明码算法:
(1)根据公式:2^k - 1 >= n+k来判断校验位的个数(例子中的数据位为8位,所以校验位的个数应该为4位)
(2)确定数据位和校验位在海明码中的位置:
H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | P4 | D3 | D2 | D1 | P3 | D0 | P2 | P1 |
(3)分组:将海明码位置的序列转换成二进制:如H1的序列为1,转化为二进制为0001。
按照以二进制是否满足:* * * 1、 * * 1 * 、* 1 * *、 1 * * *的关系来分组。
所以有{P1, D0 , D1, D3, D4, D6} {P2, D0, D2, D3, D5, D6} {P3, D1, D2, D3, D7} {P4, D4, D5, D6, D7}
校验码的值则根据1的数量的奇偶判断。当为偶校验码时,P1 = 1, P2 = 0, P3 = 1, P4 = 0.
检错:
先分组:P1、P2、P3、P4 。再分别对每个组校验,没有错的给它0,有错的给1. 按分组序号从大到小排列,若不全为0时说明发生了错误。错误的位置即为以P4P3P2P1对应的十进制数为序列的数据位位置上的数,将其取反纠错即可。如0101对应十进制数5,则D5(H10)发生了错误。
下面使用logisim模拟海明码形成与检错电路
3、循环冗余码
CRC码是利用生成多项式为k个数据为产生r个校验位来进行编码,长度为k+r
CRC码由数据位和校验位组成,数据位占k位,校验位占n-k位,求CRC编码时采用模2运算。
例如将四位有效信息1100编成循环校验码,选择生成多项式1011
1、确定M(x) = x^3 + x^2 即1100
2、将M(x)左移r位(为了空出r位,拼接r位余数),r位表示M(x)的最高次,即r=3 M(x)*(x^r) = x^6 + x^5 = 1100000
3、多项式G(x) = x^3 + x^1 + 1 即1011
4、求余数:M(x)*x^r/G(x) = 1100000/1011 = 1110 + 010/1011(其中,010是余数)
5、循环冗余码:110000010