目录
1.定点数的移位运算
1.1算数移位
数学含义:
规律总结:
1.2逻辑移位
1.3循环移位
不带进位位
带进位位
2.定点数的加减运算
3.定点数的乘除运算
3.1原码
一位乘法
除法
3.2补码
一位乘法
除法
1.定点数的移位运算
1.1算数移位
数学含义:
左移乘以二,右移除以二。
符号位不参与移位,保持不变。
码制 | 码值 | 左移 | 右移 | 空位添加 | |
正数 | 原码=反码=补码 | 0010 1110 | 0101 1100 | 0001 0111 | 0 |
码制 | 码值 | 左移 | 右移 | 空位添加 | |
负数 | 原码 | 1010 1110 | 1101 1100 | 1001 0111 | 左移:0 |
右移:0 | |||||
反码 | 1101 0001 | 1010 0011 | 1110 1000 | 左移:1 | |
右移:1 | |||||
补码 | 1101 0010 | 1010 0100 | 1110 1001 | 左移:0 | |
右移:1 |
其实仔细观察会发现:由于补码是在反码的基础上加1,所以从左往右,以补码和反码的不同的位为界限的话,
界限左边:补码反码一样,所以进行右移时最左边会出现空缺,可以像反码一样直接补1。
界限右边:则不同 ,进行左移时最右边会出现空缺,需要补0。
规律总结:
码制 | 添补代码 | |
---|---|---|
正数 | 原码 | 0 |
反码 | 0 | |
补码 | 0 | |
负数 | 原码 | 0 |
反码 | 1 | |
补码 | 左移添0 | |
右移添1 |
1.2逻辑移位
左移,右移都补0,移出的位舍弃。
1.3循环移位
不带进位位
用移出的位补上空缺
带进位位
移出的位存入进位位,原进位位补上空缺
2.定点数的加减运算
加法:逢2进1,小学列算式计算;
假设我们要计算 00001010
+ 00001011
(逢 2 进 1)
00001010
+ 00001011
------------00010101
个位 0 + 1 = 1,十位 1 + 1 = 10 ,逢 2 进 1 得到 0 并进位 1 到百位,以此类推,所以结果是 00010101
,即十进制的 21 。
减法:将减数化为补码,与被减数相加,接着逢2进1,小学列算式计算;
计算 00001010
- 00001011
。
00001010 + (-00001011)= 00001010 + [11110101]补 :
求出被减数的补数,也就是补码形式表示的-00001011,然后与被减数 00001010
相加:
00001010
+ 11110101
------------11111111
但因为这是通过补码计算得到的结果,化为原码:10000001 ,实际结果应该是 10 - 11 = -1 。
总结来说,一个数减去另一个数就相当于:这个数加上另一个数的补数:
[x - y]补 = [x]补 + [-y]补
3.定点数的乘除运算
3.1原码
一位乘法
设机器字长为n+1=5位(含1位符号位),[x]原=1.1101,[y]原=0.1010,采用原码一位乘法求x·y
符号单独处理: 符号位 =x 异或 y
数值位取绝对值进行乘法计算
采用运算器模拟:
原码一位乘法: 机器字长n+1数值部分占n位
符号位通过异或确定;
数值部分通过被乘数和乘数绝对值的n轮加法、移位来完成并根据当前乘数中参与运算的确定(ACC)加什么。
若当前运算位=1,则(ACC)+[|x|]原;
若=0,则(ACC)+0。
每轮加法后ACC、MQ的内容统一逻辑右移
1.初始时,通用寄存器中存被乘数,累加器中需要存乘积的高位,MQ中存乘数以及乘积的地位,注意累加器中的值最开始需要置0。
2.MQ中的第五位是零,ALU往ACC中加0,ACC与MQ中的值整体逻辑右移,超出的位丢弃。
3.MQ的最后一位是1,ALU向ACC中加上被乘数,接着 ACC与MQ中的值整体逻辑右移,超出的位丢弃。
4. MQ中的第五位是零,ALU往ACC中加0,ACC与MQ中的值整体逻辑右移,超出的位丢弃。
5.MQ的最后一位是1,ALU向ACC中加上被乘数,接着 ACC与MQ中的值整体逻辑右移,超出的位丢弃。
最后,由于符号位不参与运算,所以停止,将符号位单独异或的结果置为结果的符号位,结果正确。
其实不难发现,乘法就是做乘数次的被乘数加上被乘数的加法!
除法
设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,采用原码加减交替除法求x/y
1.符号位与数值位分开处理
0异或0 = 0
2.数值位做加减交替法
|x|=0.1011,|y|=0.1101,[|y|]补=0.1101,[-|y|]补=1.0011
流程图:
最后得x/y=+0.1101,余0.0111x2^-4
3.2补码
一位乘法
n轮加法、算数右移,加法规则如下:
辅助位-MQ中最低位=1时,(ACC)+[x]补
辅助位-MQ中最低位=0时,(ACC)+0
辅助位-MQ中最低位=-1时,(ACC)+[-x]补
补码的算数右移:
符号位不动,数值位右移,正数右移补0,负数右移补1(符号位是啥就补啥)
实例:
设机器字长为5位(含1位符号位,n=4),x = -0.1101,y = +0.1011,采用Booth算法求x乘以y
[x]补=1.0011,[-x]补=0.1101,[y]补=0.1011
采用运算器模拟:
1.ACC存乘积高位,MQ存乘积低位,通用寄存器X存被乘数,MQ带一个拓展的辅助位。所以ACC以及X也相应拓展,并采用双符号位。
2.辅助位-MQ最地位等于-1,ACC+[-x]补,之后ACC和MQ整体算数右移
3. 辅助位-MQ最地位等于0,ACC+0,之后ACC和MQ整体算数右移
4. 辅助位-MQ最地位等于1,ACC+[x]补,之后ACC和MQ整体算数右移
5. 辅助位-MQ最地位等于-1,ACC+[-x]补,之后ACC和MQ整体算数右移
6.由于是补码,所以符号位在最后也要参与运算,辅助位-MQ最地位等于1,ACC+[x]补。
除法
设机器字长为5位(含1位符号位,n=4),x=+0.1000,y=-0.1011,采用补码加减交替除法求x/y
[x]补=00.1000,[y]补=11.0101,[-y]补=00.1011
补码除法:
符号位参与运算。
被除数/余数、除数采用双符号位
被除数和除数同号,则被除数减去除数;
异号则被除数加上除数:
余数和除数同号,商1,余数左移一位减去除数;
余数和除数异号,商0,余数左移一位加上除数。
重复n次
[x/y]补=1.0101,余0.0111x2^-4.