16原码的乘法运算[大章]
原码乘法运算
看看我们的十进制乘法
为什么我们的进制要错位?
最终还得回归我们的进制公式
$$
0.211=2\times10{-1}+1\times10{-2}+1\times10^{-3}
$$
$$
0.985= 985 \times10^{-3}
$$
$$
0.985\times0.211= (985\times1\times10^{-6})+ (985\times 1\times10^{-5})+ (985\times2\times10^{-4})
$$
我们将小数点算上,最终我的乘法看起来应该是长城这个样子
所以我们需要将每一位的位基移位
扩展我们的手算到二进制上
我们二进制的乘法实现起来非常简单,如果被乘数是0就直接取全零,如果被乘数是1那就照抄乘数
同时我们对于$(1101\times1\times2{-8})$这样的2-8^实现起来也非常方便,只需要把我们所有的位全部向右移动8位即可
考虑如何用机器实现:
- 实际数字有正负,符号位如何处理?
- 乘积的位数扩大-倍,如何处理?
- 4个位积都要保存下来最后统一相加?
原码一位的乘法
符号单独处理:$符号位= x_5 \bigoplus y_5$
数值位取绝对值进行乘法计算
$[ |x| ]原=0.1101$
$[ |y| ]原=0.1011$
在机器中实现乘法
开始在运算器中进行演示
注:
-
在每一次开始计算的时候,我们都需要把ACC清零
-
被我们涂上灰色的1表示当前参与乘法运算的位
当前位=1,则ACC加上被乘数
当前位=0,则ACC加上0
可以看到,此时我们参与运算的值是1,所以我们让ACC+被乘数,这个过程由ALU(算术逻辑单元的加法遍历)实现
$$
00000(ACC) + 01101(X) = 01101(ACC)
$$
图中我们红色的部分叫部分积
现在我们有了两个麻烦
- 如何舍弃MQ里面已经参与运算的位
- 乘积高位不够用了,而且我们之后需要让他能够向高位进1
此时我们的解决方法也很简单,把我们的ACC和MQ统一右移,高位补零,ACC多余的值移动进MQ内
- 此时我们的运算位又是1,让我们的X+ACC
$$
00110(ACC)+01101(X)=10011(ACC)
$$
然后我们现在进行逻辑右移,右移的结果如图:
- 此时我们发现我们的下一位是0,于是我们什么都不需要动,只需要直接右移即可
$$
(ACC) + 0 \rightarrow ACC
$$
- 此时我们发现我们的这一项又是1,于是重复之前的操作
$$
00100(ACC)+01101(X)=10001(ACC)
$$
紧接着我们进行逻辑右移
此时我们就剩下最后一个位了,但是这个位我们不需要让他参与运算,因为这个位实际上是符号位
此时我们把所有红色的部分加起来就是我们最终的结果
$$
0.10001111
$$
- 最后我们来判断符号位要填0还是1
因为符号位要单独处理($符号位=x_5 \bigoplus y_5$)
$$
\begin{align*}
[x]_原=\underline{1}.1101\
[y]_原=\underline{0}.1011\
0 \bigoplus 1 = 1\
\therefore 最终我们的符号&位为1
\end{align*}
$$
总结
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!