C#進制轉換

上篇文章學習了微博短URL地址的原理,但還殘留了兩個問題 :進制轉換和位運算   所以這篇文章解決進制轉換的問題.

/////////////以下內容來源於網絡////////////////////

二進制 轉十進制

(1)二進制轉十進制 

  方法:“按權展開求和” 

  例: (1011.01)2 =(1×2^3+0×2^2+1×2^1+1×2^0+0×2^(-1)+1×2^(-2) )10 

  =(8+0+2+1+0+0.25)10 

  =(11.25)10 

  規律:個位上的數字的次數是0,十位上的數字的次數是1,......,依次遞增,而十分位的數字的次數是-1,百分位上數字的次數是-2,......,依次遞減。

(2)十進制轉二進制

 十進制整數轉二進制數:“除以2取餘,逆序排列”(除二取餘法) 

  例: (89)10 =(1011001)2

  89÷2 ……1

  44÷2 ……0

  22÷2 ……0 

  11÷2 ……1 

  5÷2 ……1 

  2÷2 ……0 

  1 

  · 十進制小數轉二進制數:“乘以2取整,順序排列”(乘2取整法)

//八進制轉十進制

//知識普及:八進制逢八進一,基數爲八,基本符號:0、1、2、3、4、5、6、7。位權8∧i。表示符號:O

例:將八進制數12.6轉換成十進制數 

  (12.6)8 = 1×8^1 + 2×8^0 + 6×8^-1 = (10.75)10

//十進制轉八進制

  方法1:採用除8取餘法。 

  例:將十進制數115轉化爲八進制數

  8| 115…… 3 

  8| 14 …… 6

  8| 1 …… 1 

  結果:(115)10 = (163)8

//十六進制轉十進

知識普及:它由0-9,A-F,組成。與10進制的對應關係是:0-9對應0-9;A-F對應10-15;N進制的數可以用0---(N-1)的數表示超過9的用字母A-F。

十進制轉十六進制

  採餘數定理分解,例如將487710轉成十六進制:

     487710÷16=30481....14(e) 

  30481÷16=1905....1 

  1905÷16=119....1 

  119÷16=7....7 

  7÷16=0....7 

  這樣就計到487710=7711E

    十六進制轉十進制與二,八進制轉十進制同理。

////////////以上內容來源於網絡////////////////

  不管是二進制,八進制,十六進制轉十進制都是根據 位置數上的值*自身進制的位置數的次方

   十進制轉二,八,十六進制爲 採用除[進制]取餘法

   根據結論,寫出方法如下的代碼:

  

/// <summary>
        /// 十進制數轉換成二、八、十六進制數
        /// </summary>
        /// <param name="int_value">十進制數</param>
        /// <param name="mod">進制</param>
        /// <returns></returns>
        public static string IntToHex(int int_value, int mod)
        {
            string hex_value = string.Empty;
            int add_value, mod_value, temp;
            char char_mod_value;
            temp = int_value;
            while (temp > 0)
            {
                add_value = temp / mod;
                mod_value = temp % mod;
                if (mod_value >= 10)
                {
                    char_mod_value = (char)(mod_value + 55);
                }
                else
                {
                    char_mod_value = (char)(mod_value + 48);
                }
                hex_value = char_mod_value + hex_value;
                temp = add_value;
            }
            return hex_value; 
}

  

 /// <summary>
        /// 非十進制數轉換成十進制
        /// </summary>
        /// <param name="hex_value">非十進制數</param>
        /// <param name="mod">模</param>
        /// <returns>十進制數</returns>
        public static int HexToInt(string hex_value, int mod)
        {
            int value = 0;
            for (int i = 0; i < hex_value.Length; i++)
            {
                int asc = Convert.ToInt32(hex_value[i]);
                if (asc >= 65)
                {
                    value = value + Convert.ToInt32((asc - 55) * System.Math.Pow(Convert.ToDouble(mod), Convert.ToDouble(hex_value.Length - i - 1)));
                }
                else
                {
                    value = value + Convert.ToInt32((asc - 48) * System.Math.Pow(Convert.ToDouble(mod), Convert.ToDouble(hex_value.Length - i - 1)));
                }
            }
            return value;
        }

  


實際上在C#中還有更簡單的方法:

Convert.ToString(int value,int toBase); 十進制轉二,八,十六進制 如:

Convert.ToString(123,2);

Convert.ToString(123,8);

Convert.ToString(123,16);

相反則

Convert.ToInt32("10101010110100001",10);

Convert.ToInt32("127623365634",10);

Convert.ToInt32("23E46D76810AB",10);

本來有進制中小數轉換的 , 發現不通用就沒上寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章