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;順序生成序號等實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM