计算机原码一位乘法

n 位原码乘法包括 n 个位积(注 1),也就是每次只利用乘数中的一位来计算位积,最终需要将 n 个位积全部累加起来得到乘积。这种方法称为原码一位乘法

1、运算法则

  • 符号位单独参加运算,数据位取绝对值参加运算。
  • 运算法则:
    • 设:\([X]_{原} = X_0.X_1 X_2...X_n\)\([Y]_{原} = Y_0.Y_1 Y_2...Y_n\)
    • 则:\(P_0 = X_0 \oplus Y_0\)\(|P| = |X| \cdot |Y|\)
  • 每次循环累加的位积为 \(|X|\) 或 0,没得到一次部分积,就将其右移一位,从而得到一位乘积。

2、举例

\(X = 0.110\)\(Y = -0.101\),计算 \([X]_{原} \cdot [Y]_{原}\)注 2

\[解:[X]_{原} = 0.110, [Y]_{原} = 1.101 \qquad \qquad \qquad \qquad\]

\[ \begin{equation} \begin{split} &部分积 \qquad \quad & 乘数/判断位 \qquad & 说明 \\ &00.000 & Y_0.101 & Y_3 = 1, 部分积 + |X| \\ {+} \; &00.110 & & \\ ···& ········& & \\ &00.110 & & \\ \rightarrow \; &00.011 & 0Y_0.10 & 每次运算结果右移一位 \\ {+} \; &00.000 & & Y_3 = 0, 部分积 + 0 \\ ···& ········ & & \\ &00.011 & & \\ \rightarrow \; &00.001 & 10Y_0.1 & 继续右移 \\ {+} \; &00.110 & & Y_3 = 1, 部分积 + |X| \\ ···& ········ & & \\ &00.111 & & \\ \rightarrow \; &00.011 & 110Y_0 & \\ \end{split} \end{equation} \]

\[ \begin{aligned} \left[X\right]_{原} · [Y]_{原} &= X_0 \oplus Y_0.011110 \\ &= 1.011110 \end{aligned} \]

以上运算过程可以结合下面的手工列竖式的过程来看:

\[ \begin{aligned} \begin{split} &0.1 \; 1\;0 \\ \times \; &0.1 \; 0 \; 1 \\ ···&······ \\ \; &0 \; 1 \; 1 \; 0 \\ 0 \; &0 \; 0 \; 0 \\ 0 \; 1 \; &1 \; 0 \\ {+} \; 0 \; 0 \; 0 \; &0 \\ ·······&······ \\ 0 \; 0 \; 1 \; &1 \; 1 \; 1 \; 0 \end{split} \end{aligned} \]


注解:

1、位积,表示乘法运算中被乘数与乘数中的一位所乘得到的积。

2、这里使用的 LaTex 语法来列竖式,由于我没有找到合适的方法来加上水平的横线(如果是完整版的 LaTex,多写一些语法还是可以实现的),所以就用点号代替了。


参考:

1、华科软院计组第 3 章 PPT。

2、《计算机组成原理》(谭志虎)


计算机原码一位乘法
http://fanyfull.github.io/2021/09/18/计算机原码一位乘法/
作者
Fany Full
发布于
2021年9月18日
许可协议