进制转换
进制转换是计算机中很常见的知识。我们人类使用的主要是十进制,从数字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,15
用A,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
就是 C
,1110
就是 E
,1001
就是 9
,按顺序写下。即 CE9
。
代码实现:
// 需要先把二进制数字转换为十进制数字,在把十进制数字转换为十六进制
let bin = '110011101001';
let oct = window.parseInt(bin, 2);
let hex = oct.toString(16);
console.log(hex); // CE9
十六进制 -> 二进制
十六进制转换为二进制:和上面的反过来,就是一分四。1个十六进制数字分成4个二进制数字。比如
DF7C
,还是按照上表来。D
就是1101
,F
就是1111
,7
就是0111
,C
就是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