恢复分区算法实现

时间:2015-03-23 14:24:04

标签: java algorithm

我试图实施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例外。这是因为我试图在一个不存在的位置设置一个字符(或一点技术)。

如何正确实现?我可以获得带前导零的二进制字符串吗?

1 个答案:

答案 0 :(得分:2)

在这样的过程中你会涉及任何String,这很奇怪。您正在使用二进制算术,因此请使用整数数据类型和运算符,尤其是按位运算符(&|^<<>>,{ {1}})。每个整数数据类型都实现“带前导零的二进制字符串”。特别是对于这种情况,考虑到恢复除法算法的约束,输入都是正的。

我可能更喜欢写中心部分:

>>>

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