二进制、八进制、十进制、十六进制相互转换
一、进制基本概念
- 二进制 (Bin) :逢二进一,数码:
0, 1
- 八进制 (Oct) :逢八进一,数码:
0-7
- 十进制 (Dec) :逢十进一,数码:
0-9
- 十六进制 (Hex) :逢十六进一,数码:
0-9, A-F
(A=10, B=11, ..., F=15)
二、其他进制 → 十进制(按权相加法)
公式:
每位数字 × 进制位权 后求和
位权:小数点左侧从右向左为 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. 整数部分:除基取余法(逆序)
- 十进制 → 二进制:不断除以
2
,记录余数(逆序读数)。
例:10 → (1010)₂
10 ÷ 2 = 5 ··· 0 ↑ 5 ÷ 2 = 2 ··· 1 ↑ 2 ÷ 2 = 1 ··· 0 ↑ 1 ÷ 2 = 0 ··· 1 → 1010
2. 小数部分:乘基取整法(顺序)
- 十进制 → 二进制:不断乘以
2
,取整数部分(顺序读数)。
例:0.125 → (0.001)₂
0.125 × 2 = 0.25 → 取整 0 0.25 × 2 = 0.5 → 取整 0 0.5 × 2 = 1.0 → 取整 1
注意:整数和小数部分需分开转换,读数方向相反。
四、二进制 ↔ 八进制/十六进制
1. 二进制 → 八进制(三位一组)
- 从小数点向左右分组,每 3 位一组,不足补零。
- 将每组转换为十进制(即八进制数码)。
例:(110101)₂ → (65)₈
110 → 6 (4+2), 101 → 5 (4+1) → 65₈ ``` [[6, 20]]
2. 二进制 → 十六进制(四位一组)
- 每 4 位一组,不足补零。
例:(11101001.1011)₂ → (E9.B)₁₆
1110 → E (14), 1001 → 9, .1011 → B (11) ``` [[4, 17]]
3. 八/十六进制 → 二进制(一位分多)
- 八进制 → 二进制:每位拆成 3 位二进制。
例:(65)₈ → (110 101)₂ = 110101₂
- 十六进制 → 二进制:每位拆成 4 位二进制。
例:(6E.2)₁₆ → (0110 1110.0010)₂
(高位零可省略)
五、八进制 ↔ 十六进制
需通过二进制中转:
八进制 → 二进制 → 十六进制
十六进制 → 二进制 → 八进制
例:(1434.55)₈ → 二进制 → (31C.B)₁₆
六、快速参考表(部分对应关系)
二进制 | 八进制 | 十进制 | 十六进制 |
---|---|---|---|
0000 | 0 | 0 | 0 |
0001 | 1 | 1 | 1 |
1000 | 10 | 8 | 8 |
1010 | 12 | 10 | A |
1111 | 17 | 15 | F |
七、编程实现(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