1

誰かが以下のコードを説明できますか?それか、いくつかの光を当てるいくつかのリソースを私に指摘してください:)

整数をbase62文字列に変換します。

private static $_characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

private static function _convertBase($num)
{
    $base = strlen(self::$_characters);
    $string = '';

    for ($t = floor(log10($num) / log10($base)); $t >= 0; $t--) {
        $a = floor($num / pow($base, $t));
        $string .= substr(self::$_characters, $a, 1);
        $num = $num - ($a * pow($base, $t));
    }

    return $string;
}

更新:私が尋ねるつもりだったもの:誰かが以下のアルゴリズムを説明できますか?:) ありがとう。

4

4 に答える 4

4

あなたは過度に複雑です:

private static $_characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

private static function _convertBase($num)
{
    $base = strlen(self::$_characters); // 62
    $string = self::$_characters[$num % $base];

    while (($num = intval($num / $base)) > 0)
    {
        $string = self::$_characters[$num % $base] . $string;
    }

    return $string;
}
于 2011-01-18T21:19:28.313 に答える
1

対数を操作する場合の式は次のとおりです。

logN(x)= log10(x)/ log10(N)。

言い換えると、基数Nの数値の対数は、数値の対数(基数10)を基数の対数(ここでも基数10)で割ったものに等しくなります。

したがって、ベース62のようにベースごとに対数関数を作成する代わりに、ネイティブのlog10()関数を使用して、それに応じて数値をスケーリングできます。

そして、この特定のアルゴリズムでは、変換する数値の桁数を62進数で決定する必要があるため、これを「for」ループで使用できます。

もちろん、log62(n)を計算せずに、whileループを使用してこれを行うこともできます。これは読者のための演習です。

于 2011-01-18T21:10:45.827 に答える
1

より疑似コード化されたバージョン。

// Maps some characters such that
//  0   ->'0'
//  9   ->'9'
//  10  ->'a'
//  35  ->'z'
//  36  ->'A'
//  61  ->'Z'
Let constant characters = List ('0'..'9', 'a'..'z', 'A'..'Z')
Let constant size = length of characters

Function LogBase(number base, number x)
    Return LogBase10(x) / LogBase10(base)

Function LeftMostPosition(unsigned integer message)
    Return Floor(LogBase(size,message))

Function ShiftRight(unsigned integer message, unsigned integer numberOfPositions)
    Return Floor(message / (size to the numberOfPositions power))

Function ShiftLeft(unsigned integer message, unsigned integer numberOfPositions)
    Return message * (size to the numberOfPositions power)

Function Decode(unsigned integer message)
    Let var buffer be a string buffer

    // Runs a number of times equal to LeftMostPosition(message) + 1
    Count position from LeftMostPosition(message) down through 0
        // Get the symbol from the left side of the message
        Let var index = ShiftRight(message, position)
        // Add the decoded character
        To buffer, add characters[index]
        // And then remove it from the incoming message
        Let message = message - ShiftLeft(index, position)

    Return contents of buffer
于 2011-01-18T21:35:31.137 に答える
0

お役に立てれば。

// Define a set of allowable characters
private static $_characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Function declaration
private static function _convertBase($num)
{
    $base = strlen(self::$_characters); // Count the number of characters available
    $string = '';                       // Initialize an empty string

    // Start the iterator off as (num / character count). Continue until it is zero.
    for ($t = floor(log10($num) / log10($base)); $t >= 0; $t--) {
        $a = floor($num / pow($base, $t));              // Find the numeric (0-$base) position of the corresponding character.
        $string .= substr(self::$_characters, $a, 1);   // Pull that character out and add it to the return string
        $num = $num - ($a * pow($base, $t));            // Subtract it from $num
    }

    return $string;                    // Return the encoded string 
}
于 2011-01-18T20:57:36.753 に答える