二进制补码乘法运算主要通过以下步骤实现,结合Booth算法和移位规则完成:
一、运算规则
符号位参与运算 乘数和被乘数均以补码形式表示,符号位直接参与运算,无需单独处理。
移位与符号扩展
- 乘数右移时,符号位同步右移(补码右移规则)。
- 部分积和被乘数需取双符号位(即同时保留符号位和数值位)以处理溢出情况。
二、核心步骤
初始化
- 初值部分积 $z_0 = _{text{补}}$,乘数 $y$ 右移1位并去掉符号位作为正数 $y^+$。
迭代计算
根据乘数最低三位 $y_{n-2}y_{n-1}y_n$ 决定操作:
- 000: $z_{i+1} = z_i + [x]_{text{补}}$,乘数右移2位。 - 001
- 010:$z_{i+1} = z_i + [x]_{text{补}}$,乘数右移2位。
- 011:$z_{i+1} = z_i + [x]_{text{补}}$,乘数右移2位。
- 100:$z_{i+1} = z_i + 2 cdot [x]_{text{补}}$,乘数右移2位。
- 101:$z_{i+1} = z_i + 2 cdot [x]_{text{补}}$,乘数右移2位。
- 110:$z_{i+1} = z_i + 2 cdot [x]_{text{补}}$,乘数右移2位。
- 111:$z_{i+1} = z_i + 2 cdot [x]_{text{补}}$,乘数右移2位。
结果处理 - 最终乘积为 $[x cdot y]_{text{补}} = z_n$,符号位由 $x$ 和 $y$ 决定。
- 若结果超出位数限制,需取模(如 $w$ 位)。
三、示例
以 $x = 1011_2$(-11),$y = 1101_2$(-13)为例:
1. 补码形式:$x = 11011_2$,$y = 10001_2$。
2. 迭代计算后得到乘积 $-143$ 的补码表示。
四、注意事项
溢出检测:
需关注部分积与被乘数的符号位是否一致,判断是否发生溢出。
效率优化:Booth算法通过减少移位次数提升效率,但需结合硬件实现细节。