📄 booth算法.txt
字号:
1
2 var cnt=0;
3 var bufstr;
4 var mdat, y1, y2, ny, my;
5 function renew(){
6 bufstr="";
7 cnt=0;
8 document.boothForm.xdat.value ="";
9 document.boothForm.ydat.value ="";
10 document.boothForm.y1dat.value="";
11 document.boothForm.y2dat.value="";
12 document.boothForm.nydat.value="";
13 document.boothForm.mydat.value="";
14 document.boothForm.yydat.value="";
15 qty.innerHTML = "";
16 pty.innerHTML = "";
17 }
18 function BinStr(m, n)
19 {
20 str="";
21 for(i=0; i<n; i++){
22 if(m%2 ==0) str="0"+str;
23 else str="1"+str;
24 m>>=1;
25 }
26 return str;
27 }
28 function BoothSet()
29 {
30 if(cnt>4)return;
31 switch(cnt){
32 case 0:
33 x = document.boothForm.xdat.value;
34 y = document.boothForm.ydat.value;
35 mdat = (x&255)<<1;
36 y1=y;
37 y2=y<<1;
38 ny=-y1;
39 my=-y2;
40 k=7;
41 document.boothForm.y1dat.value = BinStr(y, 8);
42 document.boothForm.y2dat.value = BinStr(y<<1, 8);
43 document.boothForm.nydat.value = BinStr(-y, 8);
44 document.boothForm.mydat.value = BinStr(-y<<1, 8);
45 bufstr = "00000000 "+BinStr(mdat>>1, 8)+" 0";
46 qty.innerHTML = bufstr;
47 bufstr = "";
48 break;
49 default:
50 k=mdat&7; ustr="";
51 bufstr +=(BinStr(mdat>>9, 8)+" "+BinStr(mdat>>1, 8)+" "
52 +(mdat&1)+" --=> "+BinStr(k, 3)+"<br>\n");
53 qty.innerHTML = bufstr;
54 switch(k){
55 case 1:
56 case 2: mdat+=(y1<<9);
57 ustr = BinStr(y1, 8);
58 break;
59 case 3: mdat+=(y2<<9);
60 ustr = BinStr(y2, 8);
61 break;
62 case 4: mdat+=(my<<9);
63 ustr = BinStr(my, 8);
64 break;
65 case 5:
66 case 6: mdat+=(ny<<9);
67 ustr = BinStr(ny, 8);
68 break;
69 default: ustr="00000000";
70 break;
71 }
72 document.boothForm.yydat.value = ustr;
73 vstr =(BinStr(mdat>>9, 8)+" "+BinStr(mdat>>1, 8)+" "+(mdat&1)+"<br>\n");
74 pty.innerHTML = vstr;
75 bufstr +=(ustr+"<br>\n"+vstr+"<br>\n");
76 mdat>>=2;
77 if(cnt>3){
78 mdat>>=1;
79 pty.innerHTML += "<br>"+BinStr(mdat, 16)
80 +":<font color=red><b>"+mdat+"</b></font> **OK!**\n";
81 }
82 break;
83 }
84 cnt++;
85 }
86
////////////////
Booth算法
http://10.214.47.99/shp.php?xyi=145
简单的无符号乘法就是“移位加”。
对于补码的乘法
^^^^^^^^
一、一般的方法是:
1、将乘数与被乘数的补码转换为数值
2、数值相乘
3、将乘积转换为补码。
二、但对补码分析后,发现只要将其中一个转换为数,乘以另一个补码,即是乘积的补码。
因此有:
1、将被乘数的补码转换为数值
2、被乘数数值乘以乘数的补码,即是乘积的补码。
三、对被乘数补码转换成的数值进行处理,提高乘法效率。(Booth)
这步类似于把 y*99 转换成 y*(1)(0)(-1) ------每个括号表示一位。
所以:12*99
原来:
0012
0099
------
0108
108
------
1188
现在:
0012
(1)(0)(-1)
-------------
-0012
+0000
+1200
-------
1188
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -