上篇文章學習了微博短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)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);
本來有進制中小數轉換的 , 發現不通用就沒上寫。