上篇文章学习了微博短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
十六进制转十进制与二,八进制转十进制同理。
以上内容来源于网络
不管是二进制,八进制,十六进制转十进制都是根据 位置数上的值*自身进制的位置数的次方
十进制转二,八,十六进制为 采用除[进制]取余法
根据结论,写出方法如下的代码:
////// 十进制数转换成二、八、十六进制数 /// /// 十进制数 /// 进制 ///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; }
////// 非十进制数转换成十进制 /// /// 非十进制数 /// 模 ///十进制数 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);
本来有进制中小数转换的 , 发现不通用就没上写。