二进制、八进制、十进制、十六进制相互转换
一、进制基本概念
- 二进制 (Bin) :逢二进一,数码:
0, 1 - 八进制 (Oct) :逢八进一,数码:
0-7 - 十进制 (Dec) :逢十进一,数码:
0-9 - 十六进制 (Hex) :逢十六进一,数码:
0-9, A-F(A=10, B=11, C=12, D=13, E=14, F=15)
二进制一般
0b开头,八进制一般数字0开头,十六进制一般0x开头。
二、其他进制 → 十进制(按权相加法)
其他进制转10进制,采用按权相加法,公式如下:
公式: 每位数字 × 进制位权 后求和
- 位权:从右向左,最低位为
0,依次递增。
我们主要来讲整数的转化:
1. 二进制 → 十进制
从右往左,位权从0依次递增,比如:
0b10 = 0×2⁰ + 1×2¹ = 0 + 2 = 2
0b11 = 1×2⁰ + 1×2¹ = 1 + 2 = 3
0b100 = 0×2⁰ + 0×2¹ + 1×2²= 0 + 0 + 4 = 4
0b101 = 1×2⁰ + 0×2¹ + 0×2² = 1 + 0 + 4 = 5
...2. 八进制 → 十进制
八进制方法同二进制, 只不过进制变8,即位权的基数变为8
010 = 0×8⁰ + 1×8¹ = 0 + 8 = 8
011 = 1×8⁰ + 1×8¹ = 1 + 8 = 9
...
017 = 7×8⁰ + 1×8¹ = 7 + 8 = 15
020 = 0×8⁰ + 2×8¹ = 0 + 16 = 16
021 = 1×8⁰ + 2×8¹ = 1 + 16 = 17
...3. 十六进制 → 十进制
十六进制同理:
0x10 = 0×16⁰ + 1×16¹ = 0 + 16 = 16
0x11 = 1×16⁰ + 1×16¹ = 1 + 16 = 17
...
0x19 = 9×16⁰ + 1×16¹ = 9 + 16 = 25
0x1A = 10×16⁰ + 1×16¹ = 10 + 16 = 26
...
0x1F = 15×16⁰ + 1×16¹ = 15 + 16 = 31
0x20 = 0×16⁰ + 2×16¹ = 0 + 32 = 32
...扩展:带小数转化
小数点左侧从右向左为 0 开始递增;右侧从左向右为 -1 开始递减。
- 二进制 → 十进制
(101.101)₂ = 1×2² + 0×2¹ + 1×2⁰ + 1×2⁻¹ + 0×2⁻² + 1×2⁻³ = 5.625 - 八进制 → 十进制
(67.35)₈ = 6×8¹ + 7×8⁰ + 3×8⁻¹ + 5×8⁻² = 55.453125 - 十六进制 → 十进制
(1A.08)₁₆ = 1×16¹ + 10×16⁰ + 0×16⁻¹ + 8×16⁻² = 26.03125
三、十进制 → 其他进制
根据前面的例子我们看到,十进制每加1,其他进制就会在数值末位加1, 比如:2 = 0b10, 3 = 0b11。当数字大于1,就需要进位,所以4 = 0b100。
那么如何从10进制转其他进制呢,我们可以采用除基取余法
1. 十进制 → 二进制
不断除以 2,记录余数(逆序读数)。
例:10 → 0b1010
10 ÷ 2 = 5 ··· 0 ↑
5 ÷ 2 = 2 ··· 1 ↑
2 ÷ 2 = 1 ··· 0 ↑
1 ÷ 2 = 0 ··· 1 → 10102. 十进制 → 八进制
不断除以 8,记录余数(逆序读数)。
例:1232 → 02320
1232 ÷ 8 = 154 ··· 0 ↑
154 ÷ 8 = 19 ··· 2 ↑
19 ÷ 8 = 2 ··· 3 ↑
2 ÷ 8 = 0 ··· 2 → 23203. 十进制 → 十六进制
不断除以 16,记录余数(逆序读数)。
例:2770 → 0xAD2
2770 ÷ 16 = 173 ··· 2 ↑
173 ÷ 16 = 10 ··· 13 ↑
10 ÷ 16 = 0 ··· 10 → 0xAD2扩展: 小数部分 ———— 乘基取整法(顺序)
- 十进制 → 二进制:不断乘以
2,取整数部分(顺序读数)。
例:0.125 → (0.001)₂0.125 × 2 = 0.25 → 取整 0 0.25 × 2 = 0.5 → 取整 0 0.5 × 2 = 1.0 → 取整 1
注意:整数和小数部分需分开转换,读数方向相反。
四、0~16对照表
| 十进制 (Decimal) | 二进制 (Binary) | 八进制 (Octal) | 十六进制 (Hexadecimal) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 10 | 2 | 2 |
| 3 | 11 | 3 | 3 |
| 4 | 100 | 4 | 4 |
| 5 | 101 | 5 | 5 |
| 6 | 110 | 6 | 6 |
| 7 | 111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
五、编程实现(JavaScript示例)
javascript
// 十进制 → 其他进制
let num = 110;
console.log(num.toString(2)); // 二进制: "1101110"
console.log(num.toString(8)); // 八进制: "156"
console.log(num.toString(16)); // 十六进制: "6e"
// 其他进制 → 十进制
console.log(parseInt("101010", 2)); // 42
console.log(parseInt("67", 8)); // 55
console.log(parseInt("1A", 16)); // 26