进制转换

进制转换是计算机中很常见的知识。我们人类使用的主要是十进制,从数字0到9共计十个数字,逢十进一。当然也有60进制,时间就是60进制。逢六十进一,60秒是1分钟,60分钟是1小时。而在计算机中主要使用的是二进制。二进制只有两个数字(0和1),是逢二进一的。比如 0000,每次循环加一就会是这个。0000 -> 0001 ->0010 -> 0011 -> 0100 -> 0101 -> 0110 -> 0111 -> 1000 -> 1001 -> 1010 -> 1011 -> 1100 -> 1101 -> 1110 -> 1111。除此之外,我们还有8进制,和十六进制。所以我们有必要了解进制之间的转换。八进制并不常用,所以我们主要以二进制,十进制和十六进制为例

本篇文章中的代码以JavaScript为例

十进制 -> 二进制 (重要)

口诀: 除2,取余,倒计

例子1: (21)10 => ( ? )2

21 / 2 = 10 ... 1  
10 / 2 = 5  ... 0  
5  / 2 = 2   ... 1  
2  / 2 = 1   ... 0  
1  / 2 = 0   ... 1  

结果: (21)10 => (10101)2

例子2: (87)10 => ( ? )2

87 / 2 = 43 ... 1  
43 / 2 = 21 ... 1  
21 / 2 = 10 ... 1  
10 / 2 = 5  ... 0  
5  / 2 = 2  ... 1  
2  / 2 = 1  ... 0  
1  / 2 = 0  ... 1  

结果: (21)10 => (1010111)2

代码实现:

  let num1 = 21;
  let n1 = num1.toString(2);
  console.log(n1);     // 10101

  let num2 = 87;
  let n2 = num2.toString(2);
  console.log(n2);    // 1010111

二进制 -> 十进制 (重要)

规则: 二进制转换为十进制是使用 按权相加法 :即把二进制数写成加权系数展开式,然后,按十进制加法求和。

例子1: (101101)2 => ( ? )10

(101101)2
=> 1 * 25 + 0 * 24 + 1 * 23 + 1 * 22 + 0 * 21 + 1 * 20
=> 25 + 23 + 22 + 20
=> 32 + 8 * 4 + 1
=> 45

结果: (101101)2 => ( 45 )10

例子2: (110011011)2 => ( ? )10

(110011011)2
=> 1 * 28 + 1 * 27 + 0 * 26 + 0 * 25 + 1 * 24 + 1 * 23 + 0 * 22 + 1 * 21 + 1 * 20
=> 256 + 128 + 16 + 8 + 2 + 1
=> 411

结果: (110011011)2 => ( 411 )10

代码实现:

  let binary = '101101';
  let num = window.parseInt(binary,2);
  console.log(num);     // 45

  let binary = '110011011';
  let num = window.parseInt(binary,2);
  console.log(num);     // 411

二进制 -> 十六进制

十六进制数字中超过10的数字用字母 A-F 代替,即 10,11,12,13,14,15A,B,C,D,E,F 代替。

十六进制和二进制的对照表:

                                 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  
0 1 2 3 4 5 6 7 8 9 A B C D E F  
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111  

方法: 二进制转换为十六进制的方法是 取四合一法; 即从二进制数的最后一位开始向前取,每四位为一组。如,110011101001 取成这种形式的 1100 1110 1001。然后按照上面的对照表,按照二进制的按权相加法得到一个十六进制的数字。1100 就是 C1110 就是 E1001 就是 9,按顺序写下。即 CE9

代码实现:

  // 需要先把二进制数字转换为十进制数字,在把十进制数字转换为十六进制
  let bin = '110011101001';
  let oct = window.parseInt(bin, 2);
  let hex = oct.toString(16);
  console.log(hex);     // CE9

十六进制 -> 二进制

十六进制转换为二进制:和上面的反过来,就是一分四。1个十六进制数字分成4个二进制数字。比如 DF7C,还是按照上表来。D 就是 1101F 就是 11117 就是 0111C 就是 1100。(DF7C)10 = (1101 1111 0111 1100)2

代码实现:先用 parseInt() 转换为十进制,再用 toString() 转换为二进制。

十进制 -> 十六进制

十进制转换为十六进制:需要先把十进制转换为二进制,在用上面的方法把二进制转化为十六进制。

但是代码实现更简单。用 toString() 方法。

十进制小数 -> 二进制小数

方法: 小数部分乘以2,取整数依次放到小数点后,知道小数点后为0。
例子: (0.125)10 => ( ? )2

0.125 * 2 = 0.25 ... 0  
0.25  * 2 = 0.5  ... 0  
0.5   * 2 = 1    ... 1

结果: (0.125)10 => ( 0.001 )2

二进制小数 -> 十进制小数

二进制小数到十进制小数的转换与二进制到十进制的转换是一样的道理。也是使用 按权相加法 ,不过,指数部分是负数。 例子: (0.11011)2 => ( ? )10

(0.11011)2
=> 1 * 2-1 + 1 * 2-2 + 0 * 2-3 + 1 * 2-4 + 1 * 2-5
=> 0.5 + 0.25 + 0.0625 + 0.03125 => 0.84375