1

JavaScriptで整数を10進数から別の10進数に変換するメソッドを作成する必要がありました。また、カスタムの数字配列の提供もサポートする必要があります。例えば、

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 に答える