zoukankan      html  css  js  c++  java
  • 36进制,62进制

    短网址服务就是把长的URL地址转换成短的URL。如google提供的http://goo.gl/

    短网址 http://goo.gl/mwsQP 对应的网址就是 http://www.cnblogs.com/zjfree

    短网址参考:http://baike.baidu.com/view/2693499.htm

    那为什么URL那么多怎么就可以使用5位字符就表示呢? 注意短网址后面的5位字符是区分大小写的。

    如果五个字符是(0-9)、(A-Z)、(a-z),那5位字符可以穷举多个呢?62^5 = 916132832个 如果6位呢?62^6 = 56800235584个 500多亿个网址。

    这实际上是一个62进制的数字!那么在现实的应用中经常有缩短业务单号的需求,为什么不使用这种办法呢?为了方便输入我们不区分大小写。

    我们使用(0-9)、(A-Z) 这样就得到了一个36进制的数字。36进制逢36进一,即称之为36进制,它能表示多少信息呢?

    进制说明

    10进制是 0-9 (0123456789)
    16进制是 0-F (0123456789ABCDEF)
    36进制是 0-F (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)

    信息量计算 多少位就是36的多少次方。

    1位时 36^1 = 36
    2位时 36^2 = 1296
    3位时 36^3 = 46656
    4位时 36^4 = 1679616
    5位时 36^5 = 60466176
    6位时 36^6 = 2176782336
    7位时 36^7 = 78364164096

    10进制和36进制互转代码:

    1:10进制转36进制,用10进制数除了36,取余数得最低1位,然后把商继续除36,得第二位,直到商为0。举例:

    • 1261(10进制)
    • 1261 除 36 余数 35 (对应 Z),商 1
    • 1 除 36 余数 1 (对应1),商 0 结束
    • 得到 (Z1)36

    2:36进制转10进制,36进制数按权展开,从右边第一个数开始,每一个乘以16的n次方,n从0开始,每次递增1,然后得出来的每个数相加即是十进制数。举例:

    • (Z1)(36进制) = 35 * 36的1次方+ 1 * 36的0次方 = 126110
    • (ABC)(36进制) = 10 * 36的2次方 + 11 * 36的1次方+ 12 * 36的0次方 = 1336810
    /// <summary>
    /// Convert36 的摘要说明
    /// </summary>
    public class Convert36
    {
        public Convert36()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
     
        private const string BASE_CHAR = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
        /// <summary>
        /// 转换为段字符
        /// </summary>
        /// <param name="num"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        public static string GetShortNo(int num, int length)
        {
            string str = "";
            while (num > 0)
            {
                int cur = num % BASE_CHAR.Length;
                str = BASE_CHAR[cur] + str;
                num = num / BASE_CHAR.Length;
            }
            if (str.Length > length)
            {
                str = str.Substring(str.Length - length);
            }
            else
            {
                str = str.PadLeft(length, '0');
            }
     
            return str;
        }
     
        /// <summary>
        /// 解析段字符
        /// </summary>
        /// <param name="strNo"></param>
        /// <returns></returns>
        public static int GetShortNum(string strNo)
        {
            int num = 0;
            for (int i = 0; i < strNo.Length; i++)
            {
                num += BASE_CHAR.IndexOf(strNo[i]) * (int)Math.Pow(BASE_CHAR.Length, strNo.Length - i - 1);
            }
     
            return num;
        }
    }

    实例分析:

    原订单号组成规则 1010101001 {年}{月}{日}{一天流水号} 长度为10位 它可表示00-00-00 到 99-12-31 (100年 约36500天)的时间 和一天内9999个订单不重复

    而使用36进制 {前3位表示日期}{后三位表示流水号} 长度6位 可表示46656天(约128年) 46656个流水号

     除了上面的我们还可以看到:汽车号码牌,比如: 京:A1230Z;顺序生成序号等实例

  • 相关阅读:
    myfocus官方网站已经挂掉,相关下载已经从googlecode转到网盘
    [综合]visio2013安装提示找不到Office.zh_cnofficeMUI.mis officemui.xml
    技巧分享:解决Word 2010当中“分页符”造成的空白行
    房贷计算器代码2.0
    房贷计算器代码
    图解-JS普通函数跟箭头函数中this的指向问题
    完全基于net core容器的超级轻量化的Quartz,支持类似net core mvc的过滤器,附过滤器实现源码
    net下的高性能轻量化半自动orm+linq的《SqlBatis》
    轻量级ORM《sqlcommon》第一个版本发布了!!!
    从0开始编写dapper核心功能、压榨性能、自己动手丰衣足食
  • 原文地址:https://www.cnblogs.com/duhuo/p/5753514.html
Copyright © 2011-2022 走看看