【计算机组成原理】定点乘法运算之补码一位乘法(Booth算法)

x * y = z
讨论已知x和y的情况下,怎么通过补码一位乘法方法得出z~~
首先说下运算规则~

  1. 和原码一位乘法不同的是,补码一位乘法的符号位是参加运算的~运算的所有的数包括得到的结果z都是补码的形式~
  2. 被乘数x取双符号参与运算,部分积的初值为0~~乘数y取单符号位~
  3. 乘数y末尾首先要增加一个附加位0,每次讨论的是y的最后两位~但是每次移动是移动一位哦~
  4. 判断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 柳婼

❤ 点击这里 -> 订阅《从放弃C语言到使用C++刷算法的简明教程》by 柳婼

❤ 点击这里 -> 订阅PAT甲级乙级、蓝桥杯、GPLT天梯赛、LeetCode题解离线版