2 进制转换

正在加载视频播放器…

GESP C++ 三级:进制转换精讲

核心目标:掌握二、八、十、十六进制之间的相互转换,理解整数与小数部分的转换规则,能编程实现十进制转 R 进制(2~36)和 R 进制转十进制。
十进制转其他进制——整数除基取余倒序,小数乘基取整顺序;其他进制转十进制——按权展开求和;二↔八三位一组,二↔十六四位一组。

一、考纲定位

GESP 三级考纲明确要求掌握进制转换,包括:

  • 二进制、八进制、十进制、十六进制之间的相互转换
  • 十进制转 R 进制(2 ≤ R ≤ 36)的编程实现
  • R 进制转十进制的编程实现
  • 进制转换在简单算法中的应用

常见题型:选择题(含小数转换)、程序阅读题、编程题( 十进制转 R 进制)。

二、进制基本概念

进制 基数 数字符号 C++ 前缀
二进制 2 0, 1 0b
八进制 8 0~7 0
十进制 10 0~9 无
十六进制 16 0~9, A~F 0x

十六进制字母:A=10,B=11,C=12,D=13,E=14,F=15。

按权展开:任何 R 进制数都可以按权展开为十进制。
$(a_n a_{n-1} \dots a_1 a_0 . b_1 b_2 \dots)_R = \sum a_i \times R^i$

三、十进制转其他进制(整数部分)

方法:除基取余,倒序排列。

示例:十进制 13 转二进制

13 ÷ 2 = 6 …… 1   ↑
 6 ÷ 2 = 3 …… 0   ↑
 3 ÷ 2 = 1 …… 1   ↑
 1 ÷ 2 = 0 …… 1   ↑
结果:1101

十进制 45 转八进制:

45 ÷ 8 = 5 …… 5   ↑
 5 ÷ 8 = 0 …… 5   ↑
结果:55

十进制 255 转十六进制:

255 ÷ 16 = 15 …… 15 (F)   ↑
 15 ÷ 16 = 0  …… 15 (F)   ↑
结果:FF

特判 0:十进制 0 转任何进制都是 0。

四、其他进制转十进制(整数部分)

方法:按权展开,逐项相加。

示例:二进制 1101 转十进制
1×23+1×22+0×21+1×20=8+4+0+1=131×2^3 + 1×2^2 + 0×2^1 + 1×2^0 = 8+4+0+1=13

八进制 55 转十进制
5×81+5×80=40+5=455×8^1 + 5×8^0 = 40+5=45

十六进制 2A 转十进制
2×161+10×160=32+10=422×16^1 + 10×16^0 = 32+10=42

编程技巧:从左到右遍历,result = result * base + digit。

五、二进制与八进制、十六进制的快速转换

1. 二进制 ↔ 八进制

  • 二转八:从右往左,每 3 位一组,不足左边补 0,每组转成一位八进制数。
  • 八转二:每位八进制数展开为 3 位二进制。

示例:
二进制 10101100 → 分组 010 101 100 → 八进制 254
八进制 254 → 展开 010 101 100 → 二进制 10101100

2. 二进制 ↔ 十六进制

  • 二转十六:从右往左,每 4 位一组,不足左边补 0,每组转成一位十六进制数。
  • 十六转二:每位十六进制数展开为 4 位二进制。

示例:
二进制 10101100 → 分组 1010 1100 → 十六进制 AC
十六进制 2A → 展开 0010 1010 → 二进制 101010

口诀:从右往左分组,不足左边补 0。

六、小数部分的进制转换

1. 十进制小数转其他进制

方法:乘基取整,顺序排列。

示例:十进制 0.625 转二进制

0.625 × 2 = 1.25  → 取整数 1
0.25  × 2 = 0.50  → 取整数 0
0.50  × 2 = 1.00  → 取整数 1
结果:0.101

2. 其他进制小数转十进制

方法:按权展开,负指数幂。

示例:二进制 11.01 转十进制
$1×2^1 + 1×2^0 + 0×2^{-1} + 1×2^{-2} = 2+1+0+0.25 = 3.25$

八进制 35.6 转十进制
3×81+5×80+6×8−1=24+5+0.75=29.753×8^1 + 5×8^0 + 6×8^{-1} = 24+5+0.75 = 29.75

七、编程实现:十进制转 R 进制(2~36)

题目 进制转换:输入十进制整数 num 和进制 base,输出 num 的 base 进制表示。

#include <iostream>
#include <string>
using namespace std;

string convert(int num, int base) {
    string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if (num == 0) return "0";
    string result = "";
    while (num > 0) {
        int r = num % base;
        result = digits[r] + result;   // 倒序
        num /= base;
    }
    return result;
}

int main() {
    int num, base;
    cin >> num >> base;
    cout << convert(num, base) << endl;
    return 0;
}

关键点:

  • digits 字符串建立数字到字符的映射。
  • result = digits[r] + result 实现倒序。
  • 特判 num == 0。
  • 支持 2~36 进制,超过 10 用 A~Z。

八、编程实现:R 进制转十进制

int toDecimal(string s, int base) {
    int result = 0;
    for (int i = 0; i < s.length(); i++) {
        char c = s[i];
        int digit;
        if (c >= '0' && c <= '9') digit = c - '0';
        else digit = c - 'A' + 10;   // 处理 A~F
        result = result * base + digit;
    }
    return result;
}

技巧:从左到右遍历,result = result * base + digit,无需显式计算幂。

九、真题示例

选择题

例 1:二进制数 1101.101 对应的十进制数是( )
A) 13.625 B) 13.75 C) 15.625 D) 15.75
答案:A
计算:8+4+0+1+0.5+0+0.125=13.6258+4+0+1 + 0.5+0+0.125 = 13.625

例 2:八进制数 35.6 对应的十进制数是( )
A) 29.75 B) 29.6 C) 31.75 D) 31.6
答案:A

例 3:十进制数 255 转十六进制是( )
A) FF B) FE C) 15F D) F15
答案:A

例 4:二进制数 10101100 转八进制是( )
A) 254 B) 524 C) 452 D) 245
答案:A

编程题

十进制转 R 进制:见上文代码。

其他常见编程题:

  • 输入一个二进制字符串,输出十进制。
  • 输入一个十进制数,输出二进制。
  • 输入一个十六进制字符串,输出八进制。
  • 进制转换后判断回文等。

十、易错点汇总

  1. 倒序忘记:十进制转其他进制时,余数要倒序排列。
  2. 分组方向错误:二进制转八/十六进制,必须从右往左分组,不足左边补 0。
  3. 十六进制字母大小写:题目通常要求大写,注意统一。
  4. 小数部分顺序:乘基取整是顺序排列,不是倒序。
  5. 特判 0:十进制 0 转任何进制都是 0。
  6. 进制范围:R 进制一般 2~36,超过 10 用 A~Z。
  7. 字符与数字转换:'0' 到 '9' 减 '0','A' 到 'Z' 减 'A' 加 10。
  8. 按权展开指数:整数部分从 R0R^0 开始,小数部分从 R−1R^{-1} 开始。
  9. 二进制转八进制:三位一组,不是四位;转十六进制才是四位一组。
  10. 溢出:大数转换时注意使用 long long。

十一、速查表

转换方向 方法 示例
十 → R(整数) 除基取余,倒序 13 → 1101₂
十 → R(小数) 乘基取整,顺序 0.625 → 0.101₂
R → 十(整数) 按权展开求和 1101₂ → 13
R → 十(小数) 负指数幂求和 11.01₂ → 3.25
二 → 八 三位一组,按权求和 10101100₂ → 254₈
八 → 二 每位展开三位 254₈ → 10101100₂
二 → 十六 四位一组,按权求和 10101100₂ → AC₁₆
十六 → 二 每位展开四位 2A₁₆ → 101010₂
十 → R 编程 digits[r] + result,倒序
R → 十 编程 result = result * base + digit 通用

十二、总结

进制转换是 GESP 三级的基础考点,也是编程题的高频题型。

  1. 十进制转其他进制:整数除基取余倒序,小数乘基取整顺序。
  2. 其他进制转十进制:按权展开,逐项相加。
  3. 二进制转八进制:三位一组,从右往左,不足补 0。
  4. 二进制转十六进制:四位一组,从右往左,不足补 0。
  5. 八进制转二进制:每位展开三位。
  6. 十六进制转二进制:每位展开四位。
  7. 编程实现十进制转 R 进制:用 digits 字符串映射,结果倒序拼接。
  8. 编程实现 R 进制转十进制:从左到右 result = result * base + digit。
  9. 特判 0,注意字母大小写和字符转换。
  10. 多练选择题中的含小数转换和编程题中的进制互转。

复习建议:先熟练掌握手算转换,再练习编程实现。重点练习含小数的进制转换、二进制与八/十六进制的快速互转、以及 进制转换类编程题。考试中先判断转换方向,再套用对应方法,最后检查倒序、分组和特判。