软件设计师教程学习笔记(一)数值计算

一、10进制——>2进制

1、正整数

除2取余,从下往上,位数不足2的幂次时,高位补0
例:
25----0001 1001
25/2=12=======余1
12/2=6========余0
6/2=3=========余0
3/2=1=========余1
1/2=0=========余1

2、正小数

乘2取整,从上往下
例:
0.7----0.10110011001100110011001100110011001100110011001100111
0.7*2=1.4========取出整数部分1
0.4*2=0.8========取出整数部分0
0.8*2=1.6========取出整数部分1
0.6*2=1.2========取出整数部分1
0.2*2=0.4========取出整数部分0
0.4*2=0.8========取出整数部分0
0.8*2=1.6========取出整数部分1
0.6*2=1.2========取出整数部分1
0.2*2=0.4========取出整数部分0
			……

3、负整数

绝对值转二进制,然后取反,最后对结果+1,位数不足2的幂次时,高位补1(这里是补码,要求原码直接将正数的最高位取反)
-25-----1110 0111
25/2=12=======余1
12/2=6========余0
6/2=3=========余0
3/2=1=========余1
1/2=0=========余1
1 1001---取反---0 0110---+1---0 0111----补1---1110 0111

4、负小数

二、2进制——>10进制

1、正整数

0001 1001 ---- 25
2^4 + 2^3 + 2^0 = 16 + 8 + 1 = 25

2、正小数

0.10110011001100110011001100110011001100110011001100111 ---- 0.7
0 * 2^0 + 1 * 2^-1 + 0 * 2^ -2 + 1 * 2^-3 + 1 * 2^-4 ……= 0.7

3、负整数

1110 0111 ------ -25
先取反 0001 1000,再 +1 = 0001 1001
2^4 + 2^3 + 2^0 = 16 + 8 + 1 = 25
取反 = -25

4、负小数

三、原码、反码、补码

1、正整数的原码、反码和补码都一样。
2、负数原码<—>反码转换:符号位不变,数值位按位取反
3、负数原码<—>补码转换:符号位不变,数值位按位取反+1
4、正整数原码<—>负数原码:符号位取反
5、正整数反码<—>负数反码:符号位和数值位都取反
6、正整数补码<—>负数补码:符号位和数值位都取反+1
7、原码<—>移码转换:先把这个数化为补码,然后再根据补码的第一位数字取反即可。

真值:25				-25
原码:0001 1001		1001 1001
反码:0001 1001		1110 0110
补码:0001 1001		1110 0111
移码:1001 1001		0110 0111
四、浮点数

用IEEE754将数表示为单精度浮点数

176.0625->10110000.0001
->1♦01100000001*2^7  (阶码:7,尾数:01100000001)
单精度尾数长度:23,双精度尾数长度:52
->01100000001000000000000
单精度偏移量:127,双精度偏移量:1023
单精度指数长度:8 (-126~127),双精度指数长度:11 (-1022~1023)
阶码E=7+127=134=10000110
单精度浮点数为:0 10000110 01100000001000000000000
单精度浮点数长:32 (10^-38~10^38),双精度浮点数长:64 (10^-308~10^308)

浮点数运算

加减:
1、对阶。阶码小的阶码+k,尾数右移k位;
2、求尾数和(差);
3、结果规格化,并判溢出。非规格化要转规格化,尾数溢出要调整阶码;
4、舍入处理。尾数最低为因移出而丢掉,就需要舍入处理,以求得最小运算误差;
5、溢出判别。以阶码为准,若阶码溢出,则结果溢出。若阶码下溢(小于最小值),则结果为0,否则结果正确,无溢出。
乘除:结果都需要进行规格化处理,并判断阶码是否溢出。
乘:
阶码相加,尾数相乘。
除:
阶码相减,尾数相除。
五、海明码

例:1100 1110

1、
在这里插入图片描述
根据原始信息位数n求出k——>n=8,k=4
校验码是放在2的幂次位上的,如 1,2,4,8,16…等
故校验码为:1,2,4,8

2、

位置 1 2 3 4 5 6 7 8
原始信息位 1 1 0 0 1 1 1 0
位置 1 2 3 4 5 6 7 8 9 10 11 12
加入校验码后的信息位 H1 H2 1 H3 1 0 0 H4 1 1 1 0

3、

位置 二进制
1 0001
2 0010
3 0011 H1+H2
4 0100
5 0101 H1+H3
6 0110 H2+H3
7 0111 H1+H2+H3
8 1000
9 1001 H1+H4
10 1010 H2+H4
11 1011 H1+H2+H4
12 1100 H3+H4
校验码 出现的位置 对应的值异或 结果
H1 3、5、7、9、11 1⊕1⊕0⊕1⊕1 0
H2 3、6、7、10、11 1⊕0⊕0⊕1⊕1 1
H3 5、6、7、12 1⊕0⊕0⊕0 1
H4 9、10、11、12 1⊕1⊕1⊕0 1
位置 1 2 3 4 5 6 7 8 9 10 11 12
最终信息位 0 1 1 1 1 0 0 1 1 1 1 0

4、查错
接受到的数据:1100 1110

位置 1 2 3 4 5 6 7 8 9 10 11 12
加入校验码后的信息位 H1 H2 1 H3 1 0 0 H4 1 1 1 0

G1=H1⊕1⊕1⊕0⊕1⊕1=0
G2=H2⊕1⊕0⊕0⊕1⊕1=0
G3=H3⊕1⊕0⊕0⊕0=0
G4=H4⊕1⊕1⊕1⊕0=0
G4G3G2G1=0000
都为0则没出现错误,否则出错,如G4G3G2G1=1010,则第10个位置1,数据出错
注:以上为偶校验,采用异或和全为0来判断,奇校验采用取反和全为1来判断。

参考:https://blog.csdn.net/coolskyying/article/details/78963550

你可能感兴趣的:(软件设计)