进制
十进制:逢十进一,D
二进制:逢二进一,B
八进制:逢八进一,O,Q
十六进制:逢十六进一,0X,H
进制的相互转换
除k取余法(整数部分):将十进制转换成k进制
乘k取整法(小数部分):将十进制转换成k进制
二进制转换成八进制:三位一划分
二进制转换成十六进制:四位一划分
八进制转换成二进制:一位算三位
十六进制转换成二进制:一位算四位
BCD码
真值:生活中带符号的数值
机器数:使用0表示正号,1表示负号的数字化的数
BCD码:二进制编码表示十进制数的0到9
有权BCD码:包含有8421、2421、5421等
无权BCD码:余3码、格雷码等
8421码:使用四位二进制数编码来表示 0 ~ 9 的十进制数字。十六进制数C表示+号,十六进制数D表示 - 号,符号都放在数字串的末尾处。8421遇到1001就进位。
十进制数 二进制数(BCD码)
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
余3码:无权BCD码,在8421的基础上,再加上十进制数字3(0011)。
2421码:最高位权重是2。在表示十进制数字的时候,十进制数 >= 5,则2421的最高位是1;十进制数 > 5时,则2421的最高位是0。
字符编码ASCII码和汉字编码略。
字符串大小端存放(重点)
大端模式:字符串高位在低位,字符串低位在高位
小端模式:字符串低位在低位,字符串高位在高位
大端方式直观上看上去更像人的阅读习惯。
校验码(重点)
通过一定的策略,在接收端能够对接收到的数据检查出传输中的错误。
(1)奇偶校验码
在信息的最后一位上加上一位奇偶校验码,用以判断数据在传输过程中是否发生了错误。
奇校验:添加一位校验码后,判断数据中1的个数是否为奇数
偶校验:添加一位校验码后,判断数据中0的个数是否为偶数
(2)循环冗余校验码
根据多项式构造循环冗余校验码
<1>写出 M(x)和G(x)的二进制码;
<2>M(x)左移G(x)的最高次数;
<3>将上述结果对G(x)做模二除法得余数,与被除数M(x)拼接即得到CRC码。
比如:M(x) = x三次方 + 1
G(x) = x三次方 + x + 1
M(x):1001
G(x):1011
左移M(x)三位:1001000
1001000 mod 1011 得余数110,合并即可得到CRC码1001110
模二除法:异或运算
循环冗余校验码发特性:
<1>具有r检测位的多项式能够检测出所有小于/等于r的突发错误;
<2>长度大于r+1的错误逃脱的概率是2的r次方分之1。
(3)海明码
具有一位纠错能力
在信息字段中插入一些数据,检测数据字段中哪一位数据发生了变化。
海明码有配偶原则 / 配奇原则。
确定海明码的位数:2的r次方 - 1 >= k + r
其中k是数据的位数,r是需要加的校验码的位数。
确定校验码方法:
p1 = 3 5 7 9
p2 = 3 6 7 10
p3 = 5 6 7
p4 = 9 10 11
校验海明码方法:
e1 = 1 3 5 7 9
e2 = 2 3 6 7 10
e3 = 4 5 6 7
e4 = 8 9 10 11
构建海明码步骤:
<1>确定校验码位数;
<2>将数据插入到对应的校验码位置上;
<3>根据校验位和数据位的关系,计算出校验码并插入到对应的位置上。
校验海明码步骤:
<1>将校验码中特定位一起异或运算,得到结果e4e3e2和e1;
<2>出错位即e4e3e2e1。
原码、反码、补码、移码(重点)
无符号数:最高位不表示符号
有符号数:最高位表示符号,0为正,1为负
原码、反码和补码的特点:
<1>最高位都是符号位;
<2>表示正数时,这三种表示法都是一样的;
<3>表示负数时,数值部分,补码是原码的“每位取反再加1”,反码是原码的“每位取反”;
<4>原码中不表示-1;
<5>“0”的原码和反码都有两种,而补码只有唯一的一种表示,所以补码能多表示一个负数;
<6>已知一个数的补码,求这个数的负数的补码?:将补码连同符号位在内取反后再+1。
移码:对补码表示法的改进
<1>移码就是补码的符号位取反;
<2>在真值上加上2的n次方就是移码(n是数值部分的位数);
<3>移码表示的0也是唯一的。
补码
补码运算的优点:
<1>补码运算可以直接 [x]补 + [-x]补;
<2>0的表示唯一,在数学上可逆;
<3>符号位可以参与运算,原码则不行;
<4>只需要设置加法器,减法运算可以转换;
<5>扩充数位时,只需要在最高位补符号位即可。
补码特点:
<1>-1的补码全1;
<2>最小负数的补码,首位为1,后面全0;
<3>补码可以多表示一个负数。
移位
逻辑移位:逻辑左移时,高位移丢,低位补0;右移时,低位移丢,高位补0
算术移位:
对于补码而言,最后一个1的前面部分和反码相同,后面部分与原码相同
则当机器数为正:原、反、补都补0;
当机器数为负:
<1>原码:除去符号位不动外,数值位同正数情况一样(移位添1);
<2>反码:除去符号位不动外,移位添1;
<3>补码:左移补0,右移补1。
定点数的加减运算(重点)
<1>原码定点数的加减运算
(1)加法:先判断符号位,相同则绝对值相加,不同则绝对值大的数减去绝对值小的数,结果符号同绝对值较大的数;
(2)减法:将减数的符号取反,再按原码定点数加法的方式进行运算。
<2>补码定点数的加减运算
(1)加法:符号位参加运算,并且两数和的补码等于两数的补码之和,即:
[x+y]补 = [x]补 + [y]补
(2)减法:[x-y]补 = [x]补 + [-y]补
溢出(重点)
<1>符号相同两数相加,结果符号相反,则溢出;
<2>进位判断:数值最高位的进位和符号位产生的进位进行异或,异或结果为1则溢出,结果为0则无溢出;
<3>双符号位:两位符号不同,则溢出;
原码的乘除运算(重点)
原码一位乘
运算法则:若Yi=1,+X; 若Yi=0,+0.(n次加法,n次移位)
补码的乘除运算(重点)
<1>补码一位乘
(1)校正法
若Y>0,计算方法与原码一位乘类似;
若Y<0,结果 +[-x]补校正 (校正无需移位)
(2)比较法(booth法)
采用双符号位,符号位参与运算
乘数Y末位增设Yn+1=0,根据Yn,Yn+1判断,进行n+1步加法,最后一步不移位。
浮点数的基本概念
(1)浮点数阶码的底r省略;
(2)尾数的位数反映了浮点数的精度;
(3)大多数机器中,尾数为纯小数,常用原码/补码表示;阶码为定点整数,常用补码/移码表示
IEEE 754标准(重点)
第一个部分是数符,表示浮点数的正负;
第二个部分是阶码(含有阶符),使用移码表示;
第三个部分是尾数,使用原码表示。
阶码部分使用移码,可以直观的看出阶码的大小,需要加上一个偏移量,常见的偏移量是7FH(127)、3FFH(1023)、3FFFH等。
尾数部分一般都是规格化表示,有一个隐藏位1不直接写出来。
例题:假设浮点数x的IEEE 754浮点数形式是4136 0000H,则其浮点数的十进制数值是?
答:十六进制的二进制表示:0100 0001 0011 0110 0000 0000 0000 0000
按IEEE 754标准排列:0 10000010 01101100000000000000000
指数 = 阶码 - 127(偏移量) = 10000010 - 127 = 3
尾数加上隐藏位的1:1.011011
综上,x = +(1.011011) * 2³ = +1011.011 = (11.375)D
规格化
为了提高浮点数的精度,必须要保证尾数是一个规格化的数。
尾数w需要满足1> |w|>1/2(基数为2)
(1)原码表示尾数:尾数的第一位必须是1的形式,例如0.1xxxxx或者1.1xxxxx的形式
(2)补码表示尾数:尾数的第一位必须与符号位相反,例如0.1xxxxx或1.0xxxxx的形式
尾数为-1/2的时候,其补码形式是11.1000…0。由于不满足规格化的要求,所以不是规格化的数字;
尾数为-1的时候,其补码的形式是11.000…0。由于小数补码可以表示-1,且满足规格化,则特别规定-1是规格化的数。
左规:尾数求和时,出现00.0xxx…x或者11.1xxx…x的形式,向左移动尾数,阶码减一,移动次数不确定,直到满足规格化形式时结束;
右规:尾数求和时,出现01.xxx…x或者10.xxx…x的形式,向右移动尾数,阶码加一,移动一次即可。
舍入
(1)0舍1入法:尾数右移时,移去的若是0,则舍去;移去的是1,则在尾数的末位加1。若加上这个1又导致尾数溢出,则需要右规一次;
(2)恒置1法:尾数右移时,无论丢掉的末位是0还是1,尾数末尾都恒置1.
浮点数的加减运算(重点)
<1>对阶:浮点数两数的小数点位置对齐(小阶码向大阶码对齐);
<2>尾数求和:对阶后尾数进行定点数加减运算;
<3>规格化:按上述步骤进行规格化,提高运算精度;
<4>舍入:提高精度,考虑尾数右移时丢失的数值位的影响。
例题:十进制数x=-5/256,y=+59/1024,按照上述的浮点数运算规则计算x-y,结果使用二进制表示。浮点数的格式:阶符两位,阶码3位,数符两位,尾数9位,舍入使用0舍1入法。
答:先将两个数变成二进制浮点数形式,
[x]补 = 11011,11.011000000
[y]补 = 11100,00.111011000
[-y]补 = 11100,11.000101000
<1>对阶:x的阶码比y的阶码小1,则x向y对齐,x的尾数右移一位(阶码加一),
[x]补 = 11000,11.101100000
<2>尾数求和:[x]补 - [y]补 = [x]补 + [-y]补,
即[x-y]补 = 11100,10.110001000
<3>规格化:右规一次,阶码加一,可得:
[x-y]补 = 11101,11.011000100 0舍去
<4>舍入:由于舍去的是0,则不做任何处理;
<5>溢出判断:阶符的符号为11,说明未发生溢出,则结果转换成真值即可。
算数逻辑单元
串行加法器:只设一个全加器的加法器
并行加法器:由若干个全加器组成
数字电路可分为组合逻辑电路和时序逻辑电路
组合逻辑电路:没有记忆,运算后的结果需要立即送入寄存器保存;
时序逻辑电路:具有记忆元件,即触发器,可以记录前一时刻的输出状态(CPU就是一种复杂的时序逻辑电路)。
ALU是一种组合逻辑电路,实际使用ALU时,输入端口A和B必须与锁存器相连,且运算过程中锁存器的内容不变,输出必须送到寄存器保存。
锁存器:多位触发器,常被用作运算器中的数据暂存器(临时存放数据的地方)。