算数移位
对于正数,原反补不论左移右移均补零,
注意右移时舍弃的bit非零会丢失精度,左移时丢弃的bit非零产生严重误差,因为超出最大表示范围
对于负数,
算数移位应用举例:
-20x7
逻辑移位
看作对无符号数的算数移位,即不论左移右移全都补0,移除的bit直接舍弃即可
应用举例:
循环移位
右移时把移出的bit补到最左边,左移同理
带进位位的循环移位,其中进位位用于参与更高位的计算
应用举例:大小端存储的转换,例如将一个2B的小端存储
数据:1234H,通过左移或右移8bit转换为大端存储的数据:3412H
原码一位乘法
理解:原码的乘法,数值部分和符号部分分开计算,即计算|x|*|y| 和 Ps=Xs⊕Ys
起始状态ACC为0,乘数为1011
此时乘数最低位C4=1,则ACC=(ACC)+|x|,再进行高位部分积和乘数的同时逻辑右移,此时乘数的最低位1移入丢弃位
第一个虚线处此时乘数最低位C4=1,则ACC=(ACC)+|x|,再进行高位部分积和乘数的同时逻辑右移,此时乘数的最低位1移入丢弃位
第二个虚线处,此时乘数最低位C4=0,则ACC=(ACC)+0,再进行高位部分积和乘数的同时逻辑右移,此时乘数的最低位0移入丢弃位
第三个虚线处,此时生疏最低为C4=1,则ACC=(ACC)+|x|,再进行高位部分积和乘数的同时逻辑右移,此时乘数的最低位1移入丢弃位,直至乘数被全部移出到丢弃位,运算结束
得到数值部分的结果00.1000 1111,最后Ps=1⊕0=1,最后答案xy=-0.1000 1111
补码一位乘法
理解:补码的乘法,数值部分和符号部分一起计算,补码乘法要求双符号位
辅助位-MQ的最低位=1. (ACC)+[x]补
辅助位-MQ的最低位=0. (ACC)+0
辅助位-MQ的最低位=-1. (ACC)+[-x]补
起始状态ACC为0,乘数为1011,辅助位起始为0
因为Y4Y5=1|0,所以Y5-Y4=-1,ACC=(ACC)+[-x]补,再进行高位部分积和乘数的同时算数右移,此时辅助位由0变为乘数移出的1;
第一个虚线处,因为Y4Y5=1|1,所以Y5-Y4=0,ACC=(ACC)+0,再进行高位部分积和乘数的同时算数右移,此时辅助位由1变为乘数移出的1;
第二个虚线处,因为Y4Y5=0|1,所以Y5-Y4=1,ACC=(ACC)+[x]补,再进行高位部分积和乘数的同时算数右移,此时辅助位由1变为乘数移出的0;
第三个虚线处,因为Y4Y5=1|0,所以Y5-Y4=-1,ACC=(ACC)+[-x]补,再进行高位部分积和乘数的同时算数右移,此时辅助位由0变为乘数移出的1;此时已将乘数全部移出,但补码移位需要多一次加法运算
第四个虚线处,因为Y4Y5=0|1,所以Y5-Y4=1,ACC=(ACC)+[x]补,运算结束
得到[X*Y]补的结果11.0111 0001 即xy=-0.1000 1111
原码除法恢复余数
理解:原码的除法,数值部分和符号部分分开计算,被除数就是最开始的余数
ACC存放被除数/余数,MQ存放商,通用寄存器存放除数,* 除法默认商1
初始状态ACC为0.1011,除数为0.1101,商为空,
默认商1,余数 =余数+ [-Y]补=1.1110为负数,需要恢复余数+[Y]补=0.1011
商0,余数=余数+0=0.1011,此时商=0,再左移一位=1.0110
默认商1,余数 =余数+ [-Y]补=0.1001为正数,此时商=01,再进行左移一位=1.0010
默认商1,余数 =余数+ [-Y]补=0.0101为正数,此时商=011,再进行左移一位=0.1010
默认商1,余数 =余数+ [-Y]补=1.1101为负数,需要恢复余数+[Y]补=0.1010
商0,余数=余数+0=0.1010,此时商=0110,再左移一位=1.0100
默认商1,余数 =余数+ [-Y]补=0.0111为正数,此时商=01101,因为机器字长5bit,到此结束
符号位=Xs⊕Ys=0⊕0=0
不恢复余数法:加减交替法
理解:当余数为负数时(记为a),商0,但不恢复余数,而是采用左移一位+除数(2a+b)的方法得到下一次商1的余数,从而化简步骤
初始状态ACC为0.1011,除数为0.1101,商为空,
默认商1,余数 =余数+ [-Y]补=1.1110为负数,商上0,此时商=0
余数=余数<<1+除数=0.1001为正数,商上1,此时商=01
默认商1,余数 =余数+ [-Y]补=0.0101为正数,商上1,此时商=011
默认商1,余数 =余数+ [-Y]补=1.1101为负数,商上0,此时商=0110
余数=余数<<1+除数=0.0111为正数,商上1,此时商=01101
补码除法:加减交替法
理解:首先补码的除法,符号位(双符号位)参与运算,
第一步,当被除数和除数同号,则被除数减去除数,异号则被除数加上除数
被除数00.1000,除数11.0101,异号加
当余数和除数同号则商1,余数左移一位并减去除数,异号则余数左移一位并加上除数
余数11.1101,除数11.0101,同号,商1,余数=余数<<1+[-Y]补,此时商=1
余数00.0101,除数11.0101,异号,商0,余数=余数<<1+[Y]补,此时商=10
余数11.1111,除数11.0101,同号,商1,余数=余数<<1+[-Y]补,此时商=101
余数00.1001,除数11.0101,异号,商0,余数=余数<<1+[Y]补,此时商=1010
余数00.0111,除数11.0101,异号,理论上商0,但由于是末位,恒置1即可,商为10101