进制与进制转换
一、进制是什么
1.1 为什么需要进制
我们日常写数时,使用的是“十进制”,因为我们习惯用 0∼9 这 10 个符号来表示数。
但在计算机中,最容易表示的是“只有两种状态”(开/关、真/假),因此计算机更常用“二进制”。
为了书写方便,又常把二进制用“八进制”和“十六进制”进行简写。
1.2 常见进制与数字符号
- 十进制(base=10):0,1,2,3,4,5,6,7,8,9
- 二进制(base=2):0,1
- 八进制(base=8):0,1,2,3,4,5,6,7
- 十六进制(base=16):0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
其中:A=10, B=11, C=12, D=13, E=14, F=15
1.3 “逢 base 进 1”的含义
任何进制都遵循同一个规则:
当某一位“凑满 base”,就向前一位进 1,当前位回到 0。
举例说明:
- 十进制:9 后面是 10(逢 10 进 1)
- 二进制:1 后面是 10(逢 2 进 1)
- 八进制:7 后面是 10(逢 8 进 1)
- 十六进制:F 后面是 10(逢 16 进 1)
二、进制的常用表示符号
2.1 末尾字母标注:B/O/D/H
有些教材或题面会用末尾字母来表示进制:
- B:Binary(二进制)
例如:1011B 表示二进制的 1011
- O:Octal(八进制)
例如:17O 表示八进制的 17
- D:Decimal(十进制)
例如:125D 表示十进制的 125(通常也可以不写 D)
- H:Hexadecimal (十六进制)
例如:2EH 表示十六进制的 2E
说明:
B/O/D/H 是一种“标注方式”,常见于书本、题面、笔记;在 C++ 代码里一般不会直接写 1011B 这种形式(除非当作字符串处理)。
2.2 编程里常见前缀:0b、0、0x(重点)
(1)0b:二进制前缀
- 写法:0b1011
- 解释:这是二进制的 1011
(2)0:八进制前缀
- 写法:0123
- 解释:这是八进制的 123
重要提醒:
在 C/C++ 中,数字前面如果写了一个 0(并且后面还有数字),就会被当作八进制。
例如:程序里的 010 表示八进制的 10,换成十进制是 8。
(3)0x:十六进制前缀
- 写法:0x2E、0xFF、0x1A3F
- 解释:这是十六进制的数
说明:
0x 也可以写成 0X(大写 X);十六进制中可以用 A∼F 或 a∼f(大小写都可以)。
2.3 举个例子
- 1011B=0b1011(都表示二进制 1011)
- 17O=017(都表示八进制 17)
- 125D=125(都表示十进制 125)
- 2EH=0x2E(都表示十六进制 2E)
三、整数部分的进制转换
3.1 十进制 → 其他进制(整数)
方法:除基取余,倒序排列
将十进制整数 N 转为 base 进制:
1)N÷base 得到“商”和“余数”。
2)余数就是结果的最后一位,记录下来。
3)把商当作新的 N,继续除。
4)当商变为 0 时停止。
5)把所有余数“从后往前”写出来(倒序),得到结果。
示例:13 转二进制(base=2)
13÷2=6 …… 1
6÷2=3 …… 0
3÷2=1 …… 1
1÷2=0 …… 1
倒序:1101
结论:13(十进制)= 1101(二进制)
3.2 其他进制 → 十进制(整数)
一个 base 进制数写成:an−1an−2⋯a1a0
3.2.1 方法 1:按位权展开(从右到左“数字 × 位权”相加)
规则:
- 最右边一位的位权是 base0
- 右数第二位的位权是 base1
- 右数第三位的位权是 base2
- ……依次类推
十进制值就是把每一位“数字 × 位权”相加:
十进制值=a0⋅base0+a1⋅base1+a2⋅base2+⋯+an−1⋅basen−1
示例 1:把 1101(二进制)转十进制
这里 base=2,从右往左写位权:
- 最右边 1:1×20=1
- 再往左 0:0×21=0
- 再往左 1:1×22=4
- 最左边 1:1×23=8
相加:8+4+0+1=13
结论:11012=1310
示例 2:把 2E(十六进制)转十进制
这里 base=16,并且 E=14
从右往左:
- 最右边 E:14×160=14
- 再往左 2:2×161=32
相加:32+14=46
结论:2E16=4610
3.2.2 方法 2:从左到右“乘 base 加当前位”(秦九韶法)
把 an−1an−2⋯a1a0 当成从左到右读入:
- 先令 ans=0
- 每读到一位 ai:
ans=ans×base+ai
- 读完所有位后,ans 就是十进制值
本质等价于:
(((an−1)⋅base+an−2)⋅base+an−3)⋯+a0
示例 3:把 1101(二进制)从左到右转十进制
这里 base=2,从左到右读:1,1,0,1
- 初始:ans=0
- 读到 1:ans=0×2+1=1
- 读到 1:ans=1×2+1=3
- 读到 0:ans=3×2+0=6
- 读到 1:ans=6×2+1=13
结论:11012=1310
示例 4:把 2E(十六进制)从左到右转十进制
这里 base=16,E=14,从左到右读:2,E
- 初始:ans=0
- 读到 2:ans=0×16+2=2
- 读到 E(14):ans=2×16+14=46
结论:2E16=4610
四、小数部分的进制转换
4.1 十进制小数 → base 进制小数
方法:乘基取整,顺序排列
对十进制小数 x(0≤x<1):
1)x×base
2)取“整数部分”作为小数点后的下一位
3)保留小数部分继续
4)重复若干次或小数部分为 0
示例:0.625(十进制)转二进制(base=2)
0.625×2=1.25,取 1,剩 0.25
0.25×2=0.5,取 0,剩 0.5
0.5×2=1.0,取 1,剩 0
结论:0.625(十进制)= 0.101(二进制)
重要提醒:
有些小数会“无限循环”,例如 0.1(十进制)转二进制不会有限结束。
因此题目通常会要求:保留 N 位或允许误差。
4.2 base 进制小数 → 十进制小数
以二进制为例,小数点后:
- 第 1 位表示 21
- 第 2 位表示 41
- 第 3 位表示 81
- 以此类推
示例:0.101(二进制)转十进制
=1×21+0×41+1×81
=0.5+0+0.125
=0.625
【前置知识点】
1、数学
【后置衔接知识点】
1、位运算
【思维导图】

【题目知识点分类】
