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

【题目知识点分类】
01
二进制转十进制
入门
--
练习
02
十进制转二进制
入门
--
练习
03
【进制转换】【入门】十进制数转成任意进制数
入门
--
练习
04
【进制转换】【入门】任意进制数转十进制
入门
--
练习
05
二进制转八进制
入门
--
练习
06
二进制转十六进制
入门
--
练习
07
【进制转换】正整数的任意进制转换
普及-
--
练习
08
【进制转换】输出二进制补码
入门
--
练习
09
Base K
入门
--
练习
10
Unlucky 7
入门
--
练习
11
进制转换
普及-
--
练习
12
B进制星球
普及-
--
练习
13
ABC285C - abc285_brutmhyhiizp
普及/提高-
--
练习