【问题标题】:Restoring Division Algorithm Implementation恢复除法算法实现
【发布时间】:2015-03-23 22:49:09
【问题描述】:

我正在尝试实现Restoring Division 算法,但事情发生了严重错误。这是我的代码:

public static void main(String[] args){

    int num = 10;
    long den = 2;
    long p = num;
    int n = 32;
    den = den << n;
    StringBuilder s = new StringBuilder("");
    long q = 0;
    for(int i = n; n > 0; n--){

        p = (2 * p) - den;
        if(s.length() > 0){
            s.delete(0, s.length() - 1);                
        }
        s.append(Long.toString(q,2));

        if(p >= 0){
            s.setCharAt(i, '1');
        }else{  
            s.setCharAt(i, '0');
        }

        q = Integer.parseInt(s.toString(), 2);
    }
    System.out.println(q);
}

我收到java.lang.StringIndexOutOfBoundsException: String index out of range: 32 异常。这是因为我试图在一个不存在的位置设置一个字符(或有点技术性)。

我该如何正确地实现它?我可以得到带有前导零的二进制字符串吗?

【问题讨论】:

  • 在 if 语句的两个分支中有五行相同的代码。将其放在 if 语句之后,以使您的代码更具可读性。
  • 请注意, i 以 32 开头,您在循环中递减 n。这似乎不正确,因为您的字符串在开头是空的,您访问的是位置 32 处的字符。
  • 感谢您的指出。我已经对其进行了重构。
  • 是的,我已经在我的问题中指出了这一点。
  • 我的意思是你应该考虑你的变量。您在不使用它的情况下减少 n,并使 i 保持不变。这没有任何意义,尽管我不知道所需的算法。

标签: java algorithm


【解决方案1】:

在这样的过程中您会涉及任何Strings,这很奇怪。您正在使用二进制算术,因此请使用整数数据类型和运算符,尤其是位运算符(&amp;|^&lt;&lt;&gt;&gt;&gt;&gt;&gt;)。每个整数数据类型都实现了一个“带前导零的二进制字符串”。尤其是在这种情况下,考虑到输入都是正数的恢复除法算法的约束。

我可能会把中心部分写成这样:

q = 0;
for(int i = 32; i > 0; i -= 1){
    q <<= 1;
    p = (2 * p) - den;

    if(p >= 0){
        q += 1;
    } else {
        // implicit: q += 0
        p += den;
    }
}

请注意,在每次迭代中都会操作第 0 位。之前的部分结果(第一次迭代时为 0)左移 1 以腾出空间,这样在所有 32 次迭代之后,每个位都在正确的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2016-11-06
    • 2020-05-18
    • 2017-12-10
    • 2022-01-05
    相关资源
    最近更新 更多