📄 4-6.htm
字号:
1. <b>原码乘法运算:</b></span></span></p>
<p><span style='mso-bookmark:带符号乘法运算'><span lang=EN-US style='font-size:13.5pt'>
我们一直处理的都是正数,将以上的算法转换成适合于带符号位的数的最好方法是,首先将两个操作数转化成其相应的正数,同时记录下两个操作数的符号位。这个算法将只循环31次,最高一位为符号位,将两个操作数的符号位异或产生的值置为结果的符号位。</span></span></p>
<p><span style='mso-bookmark:带符号乘法运算'><span lang=EN-US style='font-size:13.5pt'>
这种算法叫原码乘法运算.</span></span></p>
<p><span style='mso-bookmark:带符号乘法运算'><sup><span lang=EN-US style='font-size:
13.5pt'> </span></sup></span></p>
<p><span style='mso-bookmark:带符号乘法运算'><span lang=EN-US style='font-size:13.5pt'>
2. <a name="Booth's_Algorithm布斯算法"><b>Booth's Algorithm布斯算法</b></a><b> (补码乘法运算</b></span></span><b><span
style='font-size:13.5pt'>)</span></b></p>
<p><span lang=EN-US style='font-size:13.5pt'>
试想着我们计算0010<sub>two</sub>×0110<sub>two</sub>,<br>
0010<sub>two</sub><br>
×
0110<sub>two</sub><br>
---------<br>
+
0000 shift (0 in multiplier)<br>
+
0010 add (1 in multiplier)<br>
+
0010 add (1 in multiplier)<br>
+
0000 shift (0 in multiplier)<br>
----------<br>
00001100<sub>two</sub>k <br>
可以发现ALU可以通过加减得到上面计算的同样结果。<br>
For example, 6<sub>ten</sub> =-2<sub>ten</sub> + 8<sub>ten</sub>
, or 0010<sub>two</sub> = -0010<sub>two</sub> +1000<sub>two</sub>d<br>
所以有下面的算法:<br>
0010<sub>two<br>
</sub> <sub>
</sub>× 0110<sub>two</sub><br>
-----------<br>
+ 0000 shift (0 in multiplier)<br>
- 0010 sub (first 1 in multiplier)<br>
+ 0000 shift (middle of string of 1s)<br>
+
0010 add (prior step had last 1) <br>
------------<br>
00001100<sub>two</sub>k</span></p>
<p><span lang=EN-US style='font-size:13.5pt'> Booth的这个算法速度要比以前版本的算法快,因为移位比加法要快,Booth算法最关键的就是看最后两位数字的值。例图如下:</span></p>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'><img border=0 width=298 height=52 id="_x0000_i1037"
src="images\4-6-pic4.gif"></span><span lang=EN-US><o:p></o:p></span></p>
<div align=center>
<table border=1 cellspacing=0 cellpadding=0 width="84%" style='width:84.0%;
mso-cellspacing:0cm;mso-padding-alt:0cm 0cm 0cm 0cm' bordercolordark="#CC9966"
bordercolorlight="#FFCC66">
<tr>
<td width="21%" style='width:21.0%;background:#CCFF99;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Current bit</span></p>
</td>
<td width="25%" style='width:25.0%;background:#CCFF99;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Bit to the right</span></p>
</td>
<td width="32%" style='width:32.0%;background:#CCFF99;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Explanation</span></p>
</td>
<td width="25%" style='width:25.0%;background:#CCFF99;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Example</span></p>
</td>
</tr>
<tr>
<td width="21%" style='width:21.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>1</span></p>
</td>
<td width="25%" style='width:25.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0</span></p>
</td>
<td width="32%" style='width:32.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Beginning of a run of 1s</span></p>
</td>
<td width="25%" style='width:25.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>00001111000</span></p>
</td>
</tr>
<tr>
<td width="21%" style='width:21.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>1</span></p>
</td>
<td width="25%" style='width:25.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>1</span></p>
</td>
<td width="32%" style='width:32.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Middle of a run of 1s</span></p>
</td>
<td width="25%" style='width:25.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>00001111000</span></p>
</td>
</tr>
<tr>
<td width="21%" style='width:21.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0</span></p>
</td>
<td width="25%" style='width:25.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>1</span></p>
</td>
<td width="32%" style='width:32.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>End of a run of 1s</span></p>
</td>
<td width="25%" style='width:25.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>00001111000</span></p>
</td>
</tr>
<tr>
<td width="21%" style='width:21.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0</span></p>
</td>
<td width="25%" style='width:25.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0</span></p>
</td>
<td width="32%" style='width:32.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Middle of a run of 0s</span></p>
</td>
<td width="25%" style='width:25.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>00001111000</span></p>
</td>
</tr>
</table>
</div>
<p><span lang=EN-US style='font-size:13.5pt'> 第一步:有以下四种情况,这依赖于后两位的值。<br>
00:a. Middle of a string of 0s, so no arithmetic operation.<br>
01: b. End of a string of 1s, so add the multiplicand to the left half of the<br>
product.<br>
10: c. Beginning of a string of 1s, so subtract the multiplicand from the<br>
left half of the product.<br>
11: d. Middle of a string of 1s, so no arithmetic operation.<br>
我们需要在最右边加一个新的附加位 ,并且初始化为0。另外一个要求是在将product右移时,保持符号位的值右移。这样就可以处理带符号位的数字。例如将1110
0111 0<sub>two</sub>右移一位后是1111 0011 1<sub>two</sub>,而不是<br>
0111 0011 1<sub>two</sub>。这种位移称为<b>arithmetic right shift</b>,不同于a logical right
shift。<br>
Example: Lets try Booth's algorithm with negative numbers: 2<sub>ten</sub>×-3<sub>ten</sub>=-6<sub>ten</sub>
or <br>
0010<sub>two</sub>×1101<sub>two</sub>=1111
1010<sub>two</sub>.<br>
<br>
Answer: </span><span lang=EN-US><o:p></o:p></span></p>
<div align=center>
<table border=1 cellspacing=0 cellpadding=0 width="79%" style='width:79.0%;
mso-cellspacing:0cm;mso-padding-alt:0cm 0cm 0cm 0cm' bordercolordark="#CC9966"
bordercolorlight="#FFCC66">
<tr>
<td width="15%" style='width:15.0%;background:#CCFF99;padding:0cm 0cm 0cm 0cm'>
<p class=MsoNormal align=center style='text-align:center'><span lang=EN-US>Iteration</span></p>
</td>
<td width="36%" style='width:36.0%;background:#CCFF99;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Step</span></p>
</td>
<td width="19%" style='width:19.0%;background:#CCFF99;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Multiplicand</span></p>
</td>
<td width="30%" style='width:30.0%;background:#CCFF99;padding:0cm 0cm 0cm 0cm'>
<p class=MsoNormal><span lang=EN-US>Product</span></p>
</td>
</tr>
<tr>
<td width="15%" style='width:15.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0</span></p>
</td>
<td width="36%" style='width:36.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>Initial Values</span></p>
</td>
<td width="19%" style='width:19.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0010</span></p>
</td>
<td width="30%" style='width:30.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0000 1101 0</span></p>
</td>
</tr>
<tr>
<td width="15%" rowspan=2 style='width:15.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>1</span></p>
</td>
<td width="36%" style='width:36.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>1.c: 10=>Prod=Prod-Mcand</span></p>
</td>
<td width="19%" style='width:19.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0010</span></p>
</td>
<td width="30%" style='width:30.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>1110 1101 0</span></p>
</td>
</tr>
<tr>
<td width="36%" style='width:36.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>2: Shift right Product</span></p>
</td>
<td width="19%" style='width:19.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>0010</span></p>
</td>
<td width="30%" style='width:30.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
13.5pt'>1111 0110 1</span></p>
</td>
</tr>
<tr>
<td width="15%" rowspan=2 style='width:15.0%;padding:0cm 0cm 0cm 0cm'>
<p align=center style='text-align:center
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -