x * y = z
讨论已知x和y的情况下,怎么通过补码一位乘法方法得出z~~
首先说下运算规则~
- 和原码一位乘法不同的是,补码一位乘法的符号位是参加运算的~运算的所有的数包括得到的结果z都是补码的形式~
- 被乘数x取双符号参与运算,部分积的初值为0~~乘数y取单符号位~
- 乘数y末尾首先要增加一个附加位0,每次讨论的是y的最后两位~但是每次移动是移动一位哦~
- 判断y的最后两位的时候,遵循这样的规则:
- 为00或者为11的时候,直接右移一位
- 为01的时候,加x的补,然后右移一位
- 为10的时候,加-x的补,然后右移一位
5. 不过有个特例,就是最后一步不用右移一位!
举个栗子~~
比如x = -0.1101,y=0.1011
先写出x的补码:[x]补 = 11.0011,再写出-x的补码:[-x]补 = 00.1101
一开始部分积的初值是:00.0000
在y后面加个0~那么y变成了0.10110
然后从y的最后两位开始往前,0.10110当前最后两位是10,所以加上[-x]补:
00.0000 + 00.1101 = 00.1101
右移一位,变成00.01101
此时y =0.10110的最后两位变成了11(是往前挪了一个位置哦,不是两个~),按照规则应该直接右移一位就好啦,就变成了00.001101
此时y =0.10110的最后两位变成了01,所以根据规则要加[x]补:
00.001101 + 11.0011 = 11.011001
右移一位,变成了11.1011001
此时y =0.10110的最后两位变成了10,加上[-x]补:
11.1011001 + 00.1101 = 00.1000001
右移一位,变成了:00.01000001
此时y =0.10110最后两位是01(所以从这里就可以知道规则里面要在y前面补一个0的作用了吧嘿嘿),加[x]补:
00.01000001 + 11.0011 = 11.01110001
因为这已经是最后一步了,所以不用再右移了,所以最后结果就是1.01110001
这个结果是x*y的补码哦~
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼