摘要:2016软考程序员知识点突破之数据的表示与运算
程序员考试是全国软考的初级考试,通过程序员考试的合格人员具有助理工程师(或技术员)的实际工作能力和业务水平。希赛软考网整理了一些程序员考前冲刺点,供大家练习。
计算机最主要的功能是处理数值、文字、声音、图形和图像等信息,这些信息需经过数字化编码后才能被计算机接受、存储和处理。
1.进位记数制及其转换
进位计数制是利用固定的数字符号和统一的规则来计数的方法。若一种进位计数制只用r个基本符号表示数值,则称其为r进制,基本符号称为数符,r称为该数制的基数,该进制的计数规则为:逢r进一。例如我们常用的十进制中的0、1、2、3、4、5、6、7、8、9就是数符,总共有10个,10就是该进制的基数,计数规则为:逢十进一。
进位记数制中的数码的不同排列构成不同的数值,数码所在的一个数中所处的位置称为数位。数符在不同位置上的数值,我们用权来表示。权是基数的某次幂。如十进制数1234.678我们可以表示为:
1234.678=1×103+2×102+3×101+4×100+6×10-1+7×10-2+8×10-3
10i即为十进制的权,十进制数1234.678中的数码"3"在权值为101的数位上,数码"7"在权值为10-2的数位上。
计算机中常用的几种进位记数制如下表1-3所示。
表1-3 计算机中常用的进位数值的表示
(1)r进制数转换十进制数
r进制转换十进制数的方法通常采用按权展开法,即:将r进制的每一位数乘以其数位上的权,然后相加,即可求得对应的十进制数值。
例如,二进制数l0101.11的值可计算如下:
(10101.11)2=(1×24+1×22+1×20+1×2-1+1×2-2)10=(21.75)10
或 10101.11B=(1×24+1×22+1×20+1×2-1+1×2-2)D=21.75D
按照上面的方法,即可计算八进制数、十六进制数转换成十进制数。
(2)十进制数转换r进制数
十进制数转换r进制数整数部分采用"除r取余法",小数部分采用"乘r取整法".以十进制数115.375转换二进制数为例:
将整数部分所得的余数从低位到高位排列得到(1110011),小数部分从高位到低位排列得到(011),则115.375D=1110011.011B.
(3)二进制数与八进制数、十六进制数之间的转换
二进制数转换成八进制数,只要将整数部分由低位至高位、小数部分从高位到低位每三位二进制数转换成一位八进制数即可,整数部分不足三位在高位补0,低位不足三位在低位补0.二进制数转换成十六进制数,只要将整数部分由低位至高位、小数部分从高位到低位每四位二进制数转换成一位八进制数即可,整数部分不足四位在高位补0,小数部分不足四位在低位补0.
例如:将二进制数1110011.011转换成八进制数和十六进制数:
001 110 011.011B=163.3O
0111 0011.0110B=73.6H
八进制数和十六进制数转换可先转换为二进制数,然后再转换为目标进制。表1-4给出了二进制、八进制、十进制、十六进制数之间的对应关系。
表1-4 二、八、十、十六进制数之间的对应关系
2.机器数与原码、反码、补码、移码
各种数据在计算机中表示的形式称为机器数,采用二进制记数制,数的符号用0、1表示,小数点隐含表示而不占位置。机器数对应的实际数值称为数的真值。
机器数有无符号数和带符号数之分。无符号数表示正数,在机器数中无符号位。带符号数,机器数的较高位为符号位,0表示正数,1表示负数。
常用的编码方法有原码、反码、补码,机器数的这些编码方法称为码制。正数的原码、反码、补码相同,负数的原码、反码、补码则不同。
(1)原码
若机器字长为n(即采用n个二进制位表示数据),则较高位为符号位,0表示正号,1表示负号,其余n-1位表示数值的绝对值。
例如:
【+0】原=0 0000000 【-0】原=1 0000000
【+1】原=0 0000001 【-1】原=1 0000001
【+35】原=0 0100011 【-35】原=1 0100011
但是直接使用原码在计算时却会有麻烦,比如(1)10+(-1)10 = 0,如果直接使用原码则:
(00000001)2+(10000001)2 = (10000010)2
这样计算的结果是-2,也就是说,使用原码直接参与计算可能会出现错误的结果。所以,原码的符号位不能直接参与计算,必须和其他位分开,这样会增加硬件的开销和复杂性。
(2)反码
正数的反码与原码相同,负数的反码是在其原码的基础上,符号位不变,数值位按位取反。
例如:
【+0】反=0 0000000 【-0】反=1 1111111
【+1】反=0 0000001 【-1】反=1 1111110
【+35】反=0 0100011 【-35】反=1 1011100
同样对上面的加法,使用反码的结果是:
(00000001)2+ (11111110)2 = (11111111)2
这样的结果是负0,而在人们普遍的观念中,0是不分正负的。反码的符号位可以直接参与计算,而且减法也可以转换为加法计算。
(3)补码
正数的补码与原码和反码相同,负数的补码等于其反码加1.
例如:
【+0】补=0 0000000 【-0】补=0 0000000
【+1】补=0 0000001 【-1】补=1 1111111
【+35】补=0 0100011 【-35】补=1 1011101
再次做加法是这样的:
(00000001)2 + (11111111)2 = (00000000)2
直接使用补码进行计算的结果是正确的。注意到我们这里只是举例,并非证明。
对一个补码表示的数,要计算其原码,只要对它再次求补,可得该数的原码。
由于补码能使符号位与有效值部分一起参加运算,从而简化运算规则,同时它也使减法运算转换为加法运算,进一步简化计算机中运算器的电路,这使得在大部分计算机系统中,数据都使用补码表示。
补码加减运算的规则是:
参加运算的操作数用补码表示;
符号位参加运算;
若进行相加,则两个数的补码直接相加;若进行相减运算,则将减数联通符号位一起变反加1后与被减数相加;
运算结果用补码表示。
(4)移码
移码(又叫增码)是符号位取反的补码,常用于浮点数中的阶码的表示,引入的目的是为了保证浮点数的机器零为全0.
一个数的移码是将真值加上2n.由1位符号位和n位数值位组成的阶码,即 [X]移=2n + X ,而X的范围是-2n≤X ≤ 2n.
例如,X=+1011 [X]移=24+1011=11011 符号位"1"表示正号
X= -1011 [X]移=24+10101=00101 符号位"0"表示负号
移码与补码的关系: [X]移与[X]补的关系是符号位互为相反数(仅符号位不同)。
例如,X=+1011 [X]移=11011 [X]补=01011
X= -1011 [X]移=00101 [X]补=10101
移码的特点在于把可以表示的最小值转换成了1.这个特点将会用在浮点数的指数表示中。
3.定点数与浮点数
在机器中,数有两种表示方法:定点表示法和浮点表示法。
(1)定点表示法
定点表示法就是小数点的位置固定不变。通常小数点的位置有两种约定方式:定点整数和定点小数。定点整数即小数点的位置固定在最低有效数值位之后--纯整数;定点小数即小数点固定在较高有效数值位之前--纯小数。
(2)浮点表示法
由于定点表示法限于机器字长而能表示的数值范围较小,运算中很容易因结果超出范围而溢出,因此引入浮点表示法。浮点表示法即小数点位置不固定。
与十进制中的科学记数法一样,对任意一个二进制数,均可表示为:
N=2E×M
其中E称为阶码,M称为尾数。用阶码和尾数表示的数叫做浮点数,这种表示数的方法称为浮点表示法。一个数的浮点表示形式不是,当小数点的位置改变时,阶码也随着相应改变。
浮点表示法中,阶码E通常为带符号的纯整数,尾数M为带符号的纯小数。浮点数的表示格式如下:
浮点数表示的精度取决于尾数的宽度,范围取决于基数的大小和指数的宽度。
浮点数的运算主要有三个步骤:对阶、尾数计算、结果格式化。
对阶:首先计算两个数的指数差,把指数小的向指数大的对齐,并将尾数右移指数差的位数,这样两个浮点数就完成了对阶的操作。可以看出,对阶的过程可能使得指数小的浮点数失去一些有效位。如果两个浮点数阶数相差很大,大于指数小的浮点数的尾数宽度,那么对阶后那个浮点数的尾数就变成了0,即当做机器零处理了。
尾数计算:对阶完成后,两个浮点数尾数就如同定点数,计算过程同定点数计算。
结果规格化:即使将尾数的绝对值限定在区间【0.5,1】。当尾数用补码表示时需注意:
若尾数M≥0,则其规格化的尾数形式为M=0.1××××××,即尾数为正数,小数点后的第一位为1;×可以为0,也可为1.
若尾数M≤0,则其规格化得尾数形式为M=1.0××××××, 即尾数为负数,小数点后的第一位为0;×可以为0,也可为1.
4.溢出
当运算结果超出机器的表示范围时,我们称溢出。只有当两个同符号的数相加或相异符号数相减时,运算结果有可能溢出。
判断处理的方法可以再增加一个符号位,称之为第一符号位,原来那个符号位变成了第二符号位。计算时两个符号位都参与计算,如果计算结果的两个符号位相同,表示没有溢出,如果不同,就表示出现了溢出。而第一符号位才是真正的符号。
也可以通过进位信号来判断,当结果的较高位和符号位的进位信号一致时(都有进位信号或都没有进位信号),则没有溢出,否则表示有溢出。
5.ASCII码
ASCII码是美国标准信息交换码的简称,采用7个二进制位对英文字母和其它一些符号、控制符进行编码,在计算机通常使用8位一个字节来存储,其较高位为0.ASCII码已经成为一种国际通用的信息交换用代码标准。
6.汉字编码
汉字处理包括汉字的编码输入、汉字的存储和汉字的输出等环节。如图1-2所示。
图1-2 汉字处理过程
(1)输入码
汉字输入的编码方法主要分为3类:数字编码、拼音码和字形码。
数字编码常用的是国标区位码。国标区位码将标准局公布的6763个两级汉字分成94个区,每个区94位,区码和位码各用两位十进制数字表示。其优点是无重码,输入码与内部编码的转换比较方便,但汉字的编码难以记忆。
拼音码是以汉语拼音为基础的输入码,重码率高,输入速度慢。如微软拼音、智能ABC、清华紫光、全拼输入法等。
字形码以汉字的形状确定的编码。如郑码、五笔字型码等。
(2)内部码
汉字内部码是汉字在设备或信息处理系统内部最基本的表达形式,是在设备和信息处理系统内部存储、处理、传输汉字用的代码。标准GB2312-80中规定汉字国标码作为汉字机内码,一个汉字占两个字节,由于汉字国标码的区码和位码各需用7位二进制数表示,为与ASCII码区分,汉字国标码在机内存储时每个字节的较高位置"1".
(3)字形码
汉字字形码是表示汉字字形的字模数据,通常用点阵、矢量函数等方式表示。
用点阵表示的汉子字形码是汉字的输出方式。根据输出汉字的要求,有16×16、24×24、48×48点阵等。点阵的信息量很大,所占存储空间也就很大。以24×24点阵为例,一个汉字需要24×24=576位(b)二进制数来表示,占576/8=72字节(B)。因此汉字的点阵不能用于机内存储,而是存储在字库中,仅当需要时才检索字库。
汉字的矢量表示法是将汉字看做是由笔画组成的图形,提取每个笔画的坐标值,这些坐标值就决定了每一笔画的位置,将每一个汉字的所有坐标值信息组合起来就是该汉字字形的矢量信息。显然,汉字的字形和笔画不同,其矢量信息也就不同,所占内存大小也不一样。
7.校验码
在数据的传送过程中,通常采用校验码的方法来检测传送的数据是否出错。码距是校验码中的一个重要概念。一个编码系统中任意两个合法编码之间不同的二进制位的个数称为这两个码字之间的码距;该编码系统的任意两个编码之间的距离的最小值称为该编码系统的码距。码距是衡量一种编码方式的抗错误能力的一个指标。
(1)奇偶校验码
奇偶校验码是通过在编码中增加一位校验位来使编码中1的个数为奇数(奇校验)或者为偶数(偶校验)。该校验码只能发现错误,不能校正错误。
例如:对于数据10100101的水平奇校验码为1010010 0,水平偶校验码为:1010010 1.
(2)海明码
海明码通过在数据位之间插入k个校验位,扩大码距来实现检错和纠错。
假设数据位为m位,需插入k位校验位,m与k满足2k-1≥m+k.插入校验位后,编码长度为m+k,校验位位于该编码的2i(0≤i≤m+k)的位置上。设8位数据位D7D6D5D4D3D2D1D0,根据2k-1≥m+k可求得k=4,即需要4位校验位P4P3P2P1,那么校验码的插入位置如下:
若采用偶校验:
P1= D6⊕D4⊕D3⊕D1⊕D0
P2= D6⊕D5⊕D3⊕D2⊕D0
P3= D7⊕D3⊕D2⊕D1
P4= D7⊕D6⊕D5⊕D4
若采用奇校验,则将各校验位的偶校验值取反即可。
对使用海明码数据进行差错检测比较简单,只需进行一下计算:
G1= P1⊕D6⊕D4⊕D3⊕D1⊕D0
G2= P2⊕D6⊕D5⊕D3⊕D2⊕D0
G3= P3⊕D7⊕D3⊕D2⊕D1
G4= P4⊕D7⊕D6⊕D5⊕D4
若采用偶校验,则G4G3G2G1全为0时表示数据无错误(奇校验则全为1)。当G4G3G2G1不全为0时表示数据发生了错误,而且G4G3G2G1的十进制指出了发生错误的位置,例如G4G3G2G1=0110,说明H6(D2)出错了,将其取反即可纠正错误。
当出现两位错误时,这种海明码能够查错,但无法纠错。
(3)循环冗余校验码(CRC)
多项式
在循环冗余校验码中,无一例外地要提到多项式的概念。一个二进制数可以用一个多项式来表示。如1011表示为多项式x3+x1+x0,在这里,x并不表示未知数这个概念,如果把这里的x替换为2,这个多项式的值就是该数的值。从这个转换我们可以看出多项式较高幂次为n,则转换为二进制数有n+1位。
编码的组成
循环冗余校验码校验由k位信息码,加上R位的校验码。
生成多项式
和海明码的校验方程一样,生成多项式非常重要,以至于考试中总是直接给出。
由k位信息码如何生成R位的校验码的关键在于生成多项式。这个多项式是编码方程和解码方程共同约定的,编码方程将信息码的多项式除以生成多项式,将得到的余数多项式作为校验码,解码方程将收到的信息除以生成多项式,如果余数为0,则认为没有错误。如果不为0,余数则作为确定错误位置的依据。
生成多项式并非任意指定,它必须具备以下条件:较高位和最低位为1,2.数据发生错误时,余数不为0,对余数补0后,继续进行按位除,余数循环出现,这也是冗余循环校验中循环一词的来源。
校验码的生成
校验码的生成一般分三步:首先将k位数据C(x)左移R位,给校验位留下空间,得到移位后的多项式C(x)×xR;然后将移位后的信息多项式除以生成多项式,得到R位的余数多项式。最后将余数嵌入信息位左移后的空间。
例如,信息位为10100110,生成多项式a(x)=x5+x4+x+1.
则:C(x)=x7+ x 5+ x 2+X
C(x)×x R= x 5 (x 7+ x 5+ x 2+X)
= x 12+ x 10+ x 7+ x 6
求余式:
得到余式为x 4+ x 3即校验码为11000,所以得到CRC码是1010011011000.
循环冗余校验码的纠错能力取决于k值和R值。在实践中,k取值往往取得非常大,远远大于R的值,提高了编码效率。在这种情况下,循环冗余校验就只能检错不能纠错。一般来说,R位生成多项式可检测出所有双错、奇数位错和突发位错小于等于R的突发错误。使用循环冗余校验码能用很少的校验码检测出大多数的错误,检错能力是非常强的,这使得它得到了广泛的应用。
8.逻辑代数及逻辑运算
逻辑变量的取值只有"真"和"假",通常以1表示真,0表示假。
基本逻辑运算有三种:与、或、非,逻辑异或运算是由这三种基本运算组合得来的。
与运算又称逻辑乘,运算符号常用AND、∩、∧、·表示。运算规则:当且仅当参与运算的值都为"真"时,结果为"真",否则结构为假。
或运算又称逻辑加,运算符号常用OR、∪、∨、+表示。运算规则:当且仅当参与运算的值都为"假"时,结果为假,否则结果为"真".
非运算也称逻辑求反运算,常用N O T 、﹁或在变量上打一横如 表示对变量求反。
异或运算又称半加运算,常用运算符XOR或⊕。运算规则:当且仅当参与运算的两个值不同时结果为"真",否则结果为"假".
逻辑与、或、异或为双目运算,逻辑非为单目运算。表1-5给出了四种运算的运算规则。
表1-5 四种运算的运算规则
希赛软考网,拥有十四年软考培训经验,希赛网一直坚持自主研发,将丰富的软考培训经验有效融入教程研发过程,自成体系的软考在线题库(软考历年真题)、软考培训教材和软考视频教程,多样的培训方式包括在线辅导、面授、和,使考生的学习更具系统性,辅导更具针对性。采用全程督学机制,,软考平均通过率在全国。
相关推荐
软考备考资料免费领取
去领取