3.3 原码一位乘法
一、移位操作及其意义
逻辑/算数左移:数据整体左移一位,最高位移出到进位位,最低位补零;
算数左移有对数据乘2的意义;
逻辑右移:数据整体右移一位,最高位移除寄存器,最高位补零;
算数右移:数据整体右移一位,移位前最高位被复制填补移位后的最高位,最低位被移出;
(如算数移位前:$11101110$,算数移位后: $11110111$)
算数右移相当于数据除2;
二、二进制乘法的手工计算
(1) 乘法可以由加法实现
如:
0 0 1 0
× 0 1 0 1
----------------------
0 0 1 0
0 0 0 0
0 0 1 0
+ 0 0 0 0
----------------------
0 0 0 1 0 1 0
存在的问题:
需要多输入的全加器(来计算纵向的累加和得到每一数位的值,最多需要$n+1$位)
对应乘数的不同位,部分积左移次数不同,且乘法过程中总位移次数多(每一个部分积相对于上一个部分积都有一个左移操作)
需要长度为$2\*n$的积寄存器 (乘积的结果最多为$2*n$位)
(2)改进方法
0 0 1 0
× 0 1 0 1 (乘数每一次计算也要右移)
----------
0 0 1 0 (右移一位)
0 0 1 0
+ 0 0 0 0
----------
0 0 0 1 0 (右移一位)
0 0 0 1 0
+ 0 0 1 0
-----------
0 0 1 0 1 0 (右移一位)
0 0 1 0 1 0
+ 0 0 0 0
-----------
0 0 0 1 0 1 0
在改进的方法中:
对于每一位的乘法,基于FA的循环累加0或者被乘数;(这样就不用$n+1$位的全加器了)
每一次右移乘数,这样只用取第一位做乘法就行了;每一次右移部分积,移出数位的部分用乘数寄存器存储起来;
长度为$2*n$的结果被分段保存,一部分在部分积中,另外一部分被存放在了乘数寄存器中;
三种改进措施分别对应解决三个存在的问题
三、原码一位乘法运算;
符号单独参加运算,数据位取绝对值参加运算;
运算法则:
设:$[X]_原 = X_0X_1X_2…X_n, [Y]_原 = Y_0Y_1Y_2…Y_n$
则答案符号位$P_0 = X_0 \bigoplus Y_0, |P| = |X| × |Y|$
例如:
已知$X = 0110, Y = -0101$, 求 $X * Y$
$[X]_原 = 0.110, [Y]_原 = 1.101$
符号位$P_0 = 0 \bigoplus 1 = 1$
0 1 1 0
× 0 1 0 1 (取绝对值相乘)
------------
0 1 1 0
0 1 1 (右移一位)
+ 0 0 0 0
------------
0 0 1 1
0 0 1 (右移一位)
0 1 1 0
------------
0 1 1 1 (此时乘数寄存器中为10)
所以答案为$1.011110$ (首位$1$为符号位,答案由部分积和乘数寄存器中数拼成)
来咯来咯!
学弟中午好