美文网首页程序园
自定义任意进制

自定义任意进制

作者: triplestudio | 来源:发表于2020-04-24 16:02 被阅读0次

    因为数字太长,想用更短的形式来表示,十六进制还不够,于是来个自定义转换。

    分析归纳

    对于 n 进制,表示满 n 进 1 位,如 9 + 1,在 10 进制里,满 10 了,就应该是进 1 位使用 10 表示了,而在 16 进制里,因为未满 16,仍在字符集的表示范围内,所以直接使用 A 表示。

    • 二进制一个位从小到大是由二个字符组成的 01
    • 十进制一个位从小到大是由十个字符组成的 0123456789
    • 十六进制一个位从小到大是由十六个字符组成的 0123456789ABCDEF

    由此:给定一个长度的字符集,即可进行类似的表示

    算法实现

    基本思路:从个位向高位逐个得到该位的字符即可。
    以下为 javascript 实现:

    // num : 一个整数
    // charSet : 一个字符集
    function base(num, charSet){
        // 个位以内,直接返回
        if(num < charSet.length){
            return charSet.substr(num, 1);
        }
        // 递归个位以上的部分
        var high = Math.floor(num / charSet.length);
        var unit = num % charSet.length;
        return base(high, charSet) + charSet.substr(unit, 1);
    }
    
    // 以下调用输出 0 - 32 的16进制形式:
    for(var i=0; i<=32; i++){
        document.write(base(i, '0123456789ABCDEF') + ' ');
    }
    输出:0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20
    

    以下为 php 的实现:

    function base($num, $charSet){
        // 个位以内,直接返回
        if($num < strlen($charSet)){
            return substr($charSet, $num, 1);
        }
        // 递归个位以上的部分
        $high = floor($num / strlen($charSet));
        $unit = $num % strlen($charSet);
        return base($high, $charSet) . substr($charSet, $unit, 1);
    }
    
    echo base(?,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    

    以上代码得到了 S6AG,你知道是什么数字吗?

    相关文章

      网友评论

        本文标题:自定义任意进制

        本文链接:https://www.haomeiwen.com/subject/ngdfwhtx.html