原码乘法:
原码的手动乘法:就和小学学过的竖式乘法写法一致,从右到左,乘数每一位分别与被乘数相乘。
1011
x 1101
-------------------
1011
0000
1011
1011
----------------
10001111
原码的一位乘法:
原理:从传统竖式乘法里面可以看到,每次乘数只有一位与被乘数相乘。如果用乘数的最低位和被乘数相乘,再把它右移一位,就可以作为部分积,和下一位相乘后的结果相加。
具体计算:
符号位最后单独处理,绝对值参加乘法运算。该算法因为每次根据乘出的一位来计算位积,所以称为原码一位乘法。
步骤:初始部分积为0,Yi为1;若Yi为0,部分积加|X|,累加结果右移一位,得到新部分积;(i依次为n n-1 n-2....)
符号位异或运算。
(为什么要右移:对于乘数,最后一位已经用过了,没有价值,所以直接右移丢弃掉,剩下的空间刚好用来存储部分积右移的部分。换句话说,部分积可以视为在乘数左侧,每次右移挤占乘数空间)
例题:
以+1011 * -1101为例做一位乘法
初始的部分积为0,0000,0表示正数,不参与计算。部分积实际为0000. 数据显示:0000 1101
1)用乘数1101的最后一位1乘1011 并加上之前的部分积0000,结果为1011,
部分积右移一位,挤占乘数1101的位置,乘数变成了1110,部分积变成0101 数据显示: 0101 1110
2)用乘数1110的最后一位0乘1011,并加上部分积,结果为0101 数据显示: 0101 1110
部分积右移,挤占乘数,乘数变成1111,部分积变成0010 数据显示: 0010 1111
3)用乘数1111的新最后一位1乘1011,并加上部分积,结果为1101 数据显示: 1101 1111
部分积右移,挤占乘数,乘数变成1111,部分积变成0110 数据显示: 0110 1111
4)用乘数1111的新最后一位1乘1011,并加上部分积,结果为0001 数据显示: 0110 1111
部分积右移,挤占乘数,乘数变成1111,部分积为1000 数据显示:1000 1111
与乘数1111拼接
最终结果为1,1000 1111 前面的1表示负数
-------------
补码一位乘法
在计算机中用补码运算较为方便。补码乘法运算时,可以将补码的数值部分同原码一样直接做乘法,在根据乘数符号位做修正即可。
在修正X*Y时,Y的符号位为0不用修正,Y的符号位为1 时减去X
此外,补码的符号位可以直接参加运算,不用单独处理;并且他们需要两位符号位
举例:
X为+0.1011 Y为-0.1101
转化为补码后,X为00.1011 Y为11.0011
计算大致同上述步骤。由于Y的符号位为11,因此计算结果00.0010 0001要减去X补码,也就是加上-X补码
实际结果为1.0111 0001
转化为原码是-0.1000 1111
转换为原码的话为-0.1000 1111