逻辑右移:无论符号位是啥,高位都补零,并且移动的时候是整体移动(符号位也同样右移一位),然后最高位补零;
算数右移:需要考虑符号位是啥,如果符号位是1,就补1,符号位是0,就补0(符号位是啥就补啥),并且符号位不参与右移;
定点数原码的乘法有两种:
符号位单独处理:采用除数和被除数异或的方式,然后单独处理数值位;
由于运算过程会用到|x|,|y|,[y]补,[-y]补,所以最好提前计算出来;
1.恢复余数法:(推荐按照算法描述来写,更容易理解)
算法描述:
① 对被除数和除数取绝对值,先做被除数-除数。
② 判断余数是否小于0,若是,则加上除数的补,否则减去除数的补
③ 移位,重复步骤② 直到移位次数等于除数的位数,上商的次数为移位次数+1。
算法流程图:
例题:
方法二:加减交替法(不恢复余数法)
算法描述:
①被除数-除数的绝对值得到新的余数;
②根据新的余数判断如果为负数,商0,+余数的绝对值,否则商1,-余数的绝对值;
算法流程图:
需要注意的是这种方式,最后得到的余数如果是正的,不用管就是结果,如果是负的,需要再加上除数的绝对值的补码才是正确的余数;
这里除数和被除数都指的是x,y的补码(不是绝对值的补码因为符号位也参与运算);
最后不用像加减交替法那样做特殊处理;
手算模拟:原码乘法也是符号位单独处理,优先计算x,y的绝对值。原码乘法只看最低位C4;并进行逻辑右移;
因为是补码的乘法,所以需要计算被乘数x的补码和-x的补码,以及y的补码,并使用这些数据来参与运算;
增加了辅助位的概念,开始的时候辅助位是0(辅助位是在最低位后边补上的一位),后边就根据辅助位和最低位的大小差来判断当前的结果是+[x]补还是+[-x]补;