使用给定的数字数组在JavaScript中更改数字的基数

时间:2013-01-30 13:22:27

标签: javascript

我需要创建一个方法,将整数从十进制转换为JavaScript中的另一个基础,它还应该支持提供自定义数字数组。例如,

toBase(10, 2 ["A","B"])// returns 'BABA'

如果没有提供数字数组,它应该作为JavaScript'toString'方法

var a = 10;
a.toString(2);//returns '1010'

我编写了一个函数,用于将一个整数转换为另一个基数,从10号基数开始,可以选择提供数字数组 -

function toBase(number, radix, digits)  
{
    radix = radix || 10;
    digits = digits || "0123456789abcdefghijklmnopqrstuvwxyz".split("").slice(0, radix)

    if (radix > digits.length) {
        var msg = "Not enough digits to represent the number '" + number + "' in base " + radix;
        throw Error(msg);
    }

    if (number === 0) return digits[0];
    var a = []
    while (number) {
        a.splice(0, 0, digits[number % radix])
        number = parseInt(number / radix);
    }
    return a.join("");
}

这个功能对我来说很好,但我想知道有没有更好的方法呢?感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用原生toString方法,然后使用digits数组中的replace输出:

function toBase(number, radix, digits) {
    if (digits && digits.length >= radix)
        return number.toString(radix).replace(/./g, function(d) {
            return digits[ parseInt(d, radix) ];
        });
    else
        return number.toString(radix);
}

答案 1 :(得分:1)

一种方法可能比你的方式稍微快一点就是移位。当radix是2的幂时,这最容易工作,这是一个例子

function toBase(x, radix, A) {
    var r = 1, i = 0, s = '';
    radix || (radix = 10); // case no radix
    A || (A = '0123456789abcdefghijklmnopqrstuvwxyz'.split('')); // case no alphabet
    if (A.length < radix) throw new RangeError('alphabet smaller than radix');
    if (radix < 2) throw new RangeError('radix argument must be at least 2');
    if (radix < 37) return useBergisMethod(x, radix, A); // this is arguably one of the fastest ways as it uses native `.toString`
    if (x === 0) return A[0]; // short circuit 0
    // test if radix is a power of 2
    while (radix > r) {
        r = r * 2;
        i = i + 1;
    }
    if (r === radix) { // radix = 2 ^ i; fast method
        r = r - 1; // Math.pow(2, i) - 1;
        while (x > 0) {
            s = A[x & r] + s;
            x >>= i; // shift binary
        }
        return s; // done
    }
    return methodInOriginalQuestion(x, radix, A); // else not a power of 2, slower method
}
/*
toBase(74651278, 64, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzáé');
"4SnQE"
    // check reverse
var i, j = 0, s = '4SnQE', a = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzáé';
for (i = 0; i < s.length; ++i) j *= 64, j += a.indexOf(s[i]);
j; // 74651278, correct
*/