1

我被要求在 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("");
}

这个功能对我来说很好,但我想知道是否有更好的方法来做到这一点?谢谢。

4

2 回答 2

2

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

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);
}
于 2013-01-30T13:39:12.597 回答
1

一种可能比您使用的方法稍快的方法是位移。当基数是 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
*/
于 2013-01-30T14:23:21.493 回答