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 转十进制
八进制 55 转十进制
十六进制 2A 转十进制
编程技巧:从左到右遍历,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 转十进制
七、编程实现:十进制转 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
计算:
例 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 进制:见上文代码。
其他常见编程题:
- 输入一个二进制字符串,输出十进制。
- 输入一个十进制数,输出二进制。
- 输入一个十六进制字符串,输出八进制。
- 进制转换后判断回文等。
十、易错点汇总
- 倒序忘记:十进制转其他进制时,余数要倒序排列。
- 分组方向错误:二进制转八/十六进制,必须从右往左分组,不足左边补 0。
- 十六进制字母大小写:题目通常要求大写,注意统一。
- 小数部分顺序:乘基取整是顺序排列,不是倒序。
- 特判 0:十进制 0 转任何进制都是 0。
- 进制范围:R 进制一般 2~36,超过 10 用 A~Z。
- 字符与数字转换:
'0'到'9'减'0','A'到'Z'减'A'加 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 三级的基础考点,也是编程题的高频题型。
- 十进制转其他进制:整数除基取余倒序,小数乘基取整顺序。
- 其他进制转十进制:按权展开,逐项相加。
- 二进制转八进制:三位一组,从右往左,不足补 0。
- 二进制转十六进制:四位一组,从右往左,不足补 0。
- 八进制转二进制:每位展开三位。
- 十六进制转二进制:每位展开四位。
- 编程实现十进制转 R 进制:用
digits字符串映射,结果倒序拼接。 - 编程实现 R 进制转十进制:从左到右
result = result * base + digit。 - 特判 0,注意字母大小写和字符转换。
- 多练选择题中的含小数转换和编程题中的进制互转。
复习建议:先熟练掌握手算转换,再练习编程实现。重点练习含小数的进制转换、二进制与八/十六进制的快速互转、以及 进制转换类编程题。考试中先判断转换方向,再套用对应方法,最后检查倒序、分组和特判。