移位操作和原码、补码的乘除法运算规则

算数移位

对于正数,原反补不论左移右移均补零,

注意右移时舍弃的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

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值