从基数60转换为基数10

时间:2010-07-29 00:40:06

标签: actionscript-3 math

我有一个方法可以将int转换为base60 string(使用0-9,a-z和A-Z字符),但无法解决如何将其转换回来的问题。这是我将base10转换为base60的方法:

public static function toBase60(value:Number):String 
{
    var targetBase:uint = 60;
    value = value.toString().split('.')[0];
    var digits:Array = new Array();
    while (value > 0) 
    {
        digits.push(baseChars[value % targetBase]);
        value = Math.floor(value / targetBase);
    }
    var myResult:String = digits.reverse().join('');
    return myResult;
}

运作良好。但是如何将base60字符串恢复为base10 int?我碰巧使用的是ActionScript 3,但实际上,任何编程语言中的示例,通用解释或sudo代码都会很棒。

4 个答案:

答案 0 :(得分:4)

total = 0;
for each digit (front to back)
  total = total * 60 + digit

答案 1 :(得分:2)

这样做的一种方法可能是:

    public static function fromBase60(value:String):Number {
        var result:Number = 0;
        var targetBase:uint = 60;
        var digitValue:int = 0;
        for(var i:int = 0, j:int = value.length - 1; j >= 0; i++,j--) {
            digitValue = reverseMap[value.charAt(j)];
            result += Math.pow(targetBase,i) * digitValue; 
        }
        return result;
    }

看起来您有一个将数字(数字)映射到字符的数组,因此您可以预先构建反向地图并使查找更容易。使用这样的代码:

    // add this code to your class
    private static var reverseMap:Object = {};

    private static function buildReverseMap():void {
        var len:int = baseChars.length;
        for(var i:int = 0; i < len; i++) {
            reverseMap[baseChars[i]] = i;
        }
    }

    // initialize the reverse map
    {
        buildReverseMap();
    }

修改

替代实施,基于Tom Sirgedas发布的算法。这避免了调用Math.pow,尽管我怀疑你会在实践中注意到很多不同(性能方面):

    public static function fromBase60(value:String):Number {
        var result:Number = 0;
        var targetBase:uint = 60;
        var digitValue:int = 0;
        var len:int = value.length;
        for(var i:int = 0; i < len; i++) {
            digitValue = reverseMap[value.charAt(i)];
            result = result * targetBase + digitValue; 
        }
        return result;
    }

答案 2 :(得分:0)

假设你有一个函数int digit60to10(char digit)将[0-9a-zA-Z]转换为单个数字的等效十进制值,你可以这样做:

int decimalValue = 0;
foreach digit in digits (most to least significant):
  decimalValue *= 60;
  decimalValue += digit60to10(digit);

答案 3 :(得分:0)

这可能会给你一些问题。但那不是Base 60,它是基础62

编辑由于上述内容未被视为有效答案,因此以下是我如何转换基础62&lt; =&gt; 10用PHP,虽然有很多方法可以做到这一点。 http://ken-soft.com/?p=544

我也解释了为什么我在下面的评论中将其作为答案发布(虽然我同意它太简短了):)抱歉。
编辑为什么会被投票?我说的是真的!