原码一位乘:
异号相乘,符号为负;
同号相乘,符号为正。
运算法则:
求p的绝对值 |
---|
①被乘数和乘数均取绝对值参加运算,符号位单独考虑 |
②部分积的长度同被乘数,初值为0 |
从乘数的最低位yn开始判断,若yn=1,则部分积加上被乘数x的绝对值,然后右移一位,若yn=0,则部分积加上0,然后右移一位。 |
例:x=0.1101,y=-0.1011,试利用计算机实际演算标准步骤的原码一位乘来计算[x*y]原。
解析:|x|=0.1101,|y|=0.1011
由上述可归纳:
- 乘法运算可用移位和加法来实现,两个n位数相乘,共需要进行n次加法运算和n次移位操作。
- 上述运算规则同样适用于整数原码,为了区别,将“.”改为“,”
原码二位乘
原码二位乘的引入是为了提高乘法运算的速度。
原码一位乘与原码二位乘异同点:
相同点 | 运算过程中,符号位运算与数值位运算分开进行 |
---|---|
不同点 | 原码一位乘每次都采用乘数的一位来决定新的部分积的形成;原码二位乘采用乘数的两位来决定新的部分积的形成 |
原码二位乘的状态:
乘数 | 新的部分积 |
---|---|
00 | 新部分积=原部分积右移2位 |
01 | 新部分积=(原部分积+被乘数)右移2位 |
10 | 新部分积=(原部分积+被乘数*2)右移2位 |
11 | 新部分积=(原部分积+被乘数*3)右移2位‘ |
Cj触发器:00-11只能表示0-3倍,所以要引入标志位Cj。通过乘数“11”表示的3倍,再加上Cj位置“1”来实现加1倍,可以实现4倍被乘数(加几倍被乘数都是加在部分积上的)。
但是,4-1倍被乘数|x|中(|x|是绝对值,因为符号位分开运算),有-|x|,所以要采用“[-|x|]补”补码来实现,参与原码两位乘运算的操作数都是绝对值的补码(绝对值是正数,所以原码=补码。因为实际上是加3倍的|x|,所以结果为正,补码结果=原码结果)。
例:已知x=-0.1101,y=0.0110,用原码二位乘法[x*y]原?
|x|=0.1101, 2|x|=1.1010,|y|=0.0110
由上述归纳:
- 当乘数的位数为偶数时,需要做n/2次移位,最多做(n/2)+1次加法;
- 当乘法的位数为奇数时,需要做(n/2)+1次移位,最多做(n/2)+1次加法。
明显比原码一位乘的移位次数和加法次数要少,所以速度更快。
《计算机组成原理》——唐朔飞