布思算法——基于二进制队列的Java实现

前面一篇提到二进制队列实现了 N位二进制的补码,那么我们来实现布思算法。

关于BinaryQueue:https://www.cnblogs.com/XT-xutao/p/10050518.html

 

先来思考:我们这样实现二进制乘法呢?

对于无符号整数,是可以转化为加法的:

布思算法——基于二进制队列的Java实现

那么补码形式呢?好像一些也是可以用上面这种转化为加法的:

 

布思算法——基于二进制队列的Java实现

上面被乘数-7是小于0的,但是乘数为负的时候好像就不能工作了,因为不能正确地得出部分积。

怎么办呢?

还有一种方法: 就是在乘之前先判断符号,如果异号,则结果为负,用他们的绝对值形式乘就可以了,最后加符号就行。

但是,这种方法似乎太麻烦了,我们更偏向于——布思算法(BOOTH)

布思算法是基于: 2^n+2^n-1......2^n-k  =  2^(n+1) - 2^(n-k)

它有两大优点:

1.避免了如上的那种复杂操作。

2.减少了不必要的加法,节约了时间。

 

那么在计算机底层是怎么实现的呢?

可以用几个寄存器搞定:

A:附加寄存器,初始化0

Q:乘数寄存器

M:被乘数寄存器

Q0:乘数的最低位,初始化0

布思算法——基于二进制队列的Java实现

根据流程图就可以实现了。

 

那么代码怎么实现呢?

1 package computerOrganizationAndArchitecture.IntegerOperation; 2 3 import computerOrganizationAndArchitecture.BinaryQueue; 4 5 /** 6 * Created by XuTao on 2018/12/1 19:27 7 * 用BinaryQueue实现布思算法 (Java语言) 8 */ 9 public class Booth { 10 BinaryQueue Q, M, A; // Q:乘数; M:被乘数; A: 附加 11 private String n1,n2; 12 public Booth(String str1, String str2) {//要进行操作的两个二进制数的字符串模式 13 this.n1=str1; 14 this.n2=str2; 15 int len; // 最长的长度(如果两个二进制不一样长的话) 16 //扩展短的那个 17 if (n1.length() > n2.length()) { 18 String s = ""; 19 len = n1.length() - n2.length(); 20 for (int i = 0; i < len; i++) { 21 s += n2.charAt(0); 22 } 23 n2 = s + n2; 24 } 25 else if (n1.length()<n2.length()){ 26 String s = ""; 27 len = n2.length() - n1.length(); 28 for (int i = 0; i < len; i++) { 29 s += n1.charAt(0); 30 } 31 n1 = s + n1; 32 System.out.println(n1); 33 } 34 else len = n1.length(); 35 36 Q = new BinaryQueue(n1); 37 M = new BinaryQueue(n2); 38 A = new BinaryQueue(len); 39 int Q0 = 0; //Q的最低位,初始化为0,用于判断要进行的操作 40 41 System.out.println(A.getStr() + " " + Q.getStr() + " " + Q0 + " " + M.getStr()); 42 for (int i = 0; i < len; i++) { 43 if (Q.getLast() == 1 && Q0 == 0) {//1-0 模式,A= A-M, 44 A = A.subtract(M); 45 } else if (Q.getLast() == 0 && Q0 == 1) { 46 A = A.add(M); 47 } 48 //AQQ0右移一位 49 Q0 = Q.getLast(); 50 Q.shiftRight(); 51 Q.set(0, A.getLast()); 52 A.shiftRightArithmetically(); 53 54 System.out.println(A.getStr() + " " + Q.getStr() + " " + Q0 + " " + M.getStr()); 55 } 56 BinaryQueue bq = new BinaryQueue(A.getStr() + Q.getStr()); 57 System.out.println(A.getStr() + Q.getStr()); 58 System.out.println(bq.getInt()); 59 } 60 61 public static void main(String[] args) { 62 new Booth("0011", "1111"); //3 * -1 = -3 63 new Booth("111111", "001111"); //-1 * 15 = -15 64 new Booth("011110", "001111"); //30 * 15 = 450 65 } 66 67 }

demo:

A Q Q0 M

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxzyg.html