无限大小的基本转换?

时间:2011-05-03 23:06:52

标签: javascript biginteger base-conversion

我正在尝试使用整数数组在JavaScript中实现BigInt类型。现在每个都有一个256的上限。我已经完成了所有整数操作,但我无法弄清楚如何将BigInt转换为它的字符串表示。当然,简单的方法是:

BigInt.prototype.toString = function(base) {
    var s = '', total = 0, i, conv = [
        ,,
        '01',
        '012',
        '0123',
        '01234',
        '012345',
        '0123456',
        '01234567',
        '012345678',
        '0123456789',
        ,
        ,
        ,
        ,
        ,
        '0123456789abcdef'
    ];
    base = base || 10;

    for(i = this.bytes.length - 1; i >= 0; i--) {
        total += this.bytes[i] * Math.pow(BigInt.ByteMax, this.bytes.length - 1 - i);
    }

    while(total) {
        s = conv[base].charAt(total % base) + s;
        total = Math.floor(total / base);
    }

    return s || '0';
};

但是当BigInts实际上得到 big 时,我将无法通过添加进行转换。如何将base-x数组转换为base-y数组?

2 个答案:

答案 0 :(得分:1)

最近看到我在这个答案中给出的类似问题的例子(它是基数为10到基数为3,但原则应该是可转移的):C Fast base convert from decimal to ternary

总结:

  

迭代输入   数字,从低到高。对于每一个   数字位置,先计算一下   1000 .... 000(base-256)将在输出表示中(它是之前的256倍)   功率256)。然后乘以那个   数字结果,并累积   进入输出表示。

     

您将需要执行的例程   乘法和加法   输出表示。该   可以编写乘法例程   就增加例程而言。

请注意,我没有声称这种方法在任何方面都很快(我认为它的数字是 O(n ^ 2));我确信算法上的方法比这更快。

答案 1 :(得分:0)

如果你准备比我现在更多地提出你的数学思维上限,似乎有人解释了如何使用Pascal三角形转换数字表示:

http://home.ccil.org/~remlaps/DispConWeb/index.html

底部附近有源代码链接。它们是Java而不是JavaScript,但是如果你正在努力学习数学,你可能会想出自己的实现或者努力移植代码......