进制转换

题单类型:官方题单
创建人:
ACGO官方
题数:13
收藏题单
完成度:0/13

进制与进制转换

一、进制是什么

1.1 为什么需要进制

我们日常写数时,使用的是“十进制”,因为我们习惯用 090\sim 91010 个符号来表示数。
但在计算机中,最容易表示的是“只有两种状态”(开/关、真/假),因此计算机更常用“二进制”。
为了书写方便,又常把二进制用“八进制”和“十六进制”进行简写。

1.2 常见进制与数字符号

  1. 十进制(base=10base=10):0,1,2,3,4,5,6,7,8,90,1,2,3,4,5,6,7,8,9
  2. 二进制(base=2base=2):0,10,1
  3. 八进制(base=8base=8):0,1,2,3,4,5,6,70,1,2,3,4,5,6,7
  4. 十六进制(base=16base=16):0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F0,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=15A=10,\ B=11,\ C=12,\ D=13,\ E=14,\ F=15

1.3 “逢 basebase11”的含义

任何进制都遵循同一个规则:
当某一位“凑满 basebase”,就向前一位进 11,当前位回到 00

举例说明:

  • 十进制:99 后面是 1010(逢 101011
  • 二进制:11 后面是 1010(逢 2211
  • 八进制:77 后面是 1010(逢 8811
  • 十六进制:FF 后面是 1010(逢 161611

二、进制的常用表示符号

2.1 末尾字母标注:B/O/D/HB/O/D/H

有些教材或题面会用末尾字母来表示进制:

  • BB:Binary(二进制)
    例如:1011B1011B 表示二进制的 10111011
  • OO:Octal(八进制)
    例如:17O17O 表示八进制的 1717
  • DD:Decimal(十进制)
    例如:125D125D 表示十进制的 125125(通常也可以不写 DD
  • HH:Hexadecimal (十六进制)
    例如:2EH2EH 表示十六进制的 2E2E

说明:
B/O/D/HB/O/D/H 是一种“标注方式”,常见于书本、题面、笔记;在 C++ 代码里一般不会直接写 1011B1011B 这种形式(除非当作字符串处理)。


2.2 编程里常见前缀:0b0b000x0x(重点)

(1)0b0b:二进制前缀

  • 写法:0b10110b1011
  • 解释:这是二进制的 10111011

(2)00:八进制前缀

  • 写法:01230123
  • 解释:这是八进制的 123123

重要提醒:
在 C/C++ 中,数字前面如果写了一个 00(并且后面还有数字),就会被当作八进制。
例如:程序里的 010010 表示八进制的 1010,换成十进制是 88

(3)0x0x:十六进制前缀

  • 写法:0x2E0x2E0xFF0xFF0x1A3F0x1A3F
  • 解释:这是十六进制的数

说明:
0x0x 也可以写成 0X0X(大写 XX);十六进制中可以用 AFA\sim Fafa\sim f(大小写都可以)。


2.3 举个例子

  • 1011B=0b10111011B = 0b1011(都表示二进制 10111011
  • 17O=01717O = 017(都表示八进制 1717
  • 125D=125125D = 125(都表示十进制 125125
  • 2EH=0x2E2EH = 0x2E(都表示十六进制 2E2E

三、整数部分的进制转换

3.1 十进制 \rightarrow 其他进制(整数)

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

将十进制整数 NN 转为 basebase 进制:
1)N÷baseN \div base 得到“商”和“余数”。
2)余数就是结果的最后一位,记录下来。
3)把商当作新的 NN,继续除。
4)当商变为 00 时停止。
5)把所有余数“从后往前”写出来(倒序),得到结果。

示例:1313 转二进制(base=2base=2

13÷2=613 \div 2 = 6 …… 11
6÷2=36 \div 2 = 3 …… 00
3÷2=13 \div 2 = 1 …… 11
1÷2=01 \div 2 = 0 …… 11
倒序:11011101
结论:1313(十进制)== 11011101(二进制)


3.2 其他进制 → 十进制(整数)

一个 basebase 进制数写成:an1an2a1a0a_{n-1}a_{n-2}\cdots a_1a_0


3.2.1 方法 1:按位权展开(从右到左“数字 × 位权”相加)

规则:

  • 最右边一位的位权是 base0base^0
  • 右数第二位的位权是 base1base^1
  • 右数第三位的位权是 base2base^2
  • ……依次类推

十进制值就是把每一位“数字 ×\times 位权”相加:

十进制值=a0base0+a1base1+a2base2++an1basen1\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:把 11011101(二进制)转十进制

这里 base=2base=2,从右往左写位权:

  • 最右边 111×20=11\times 2^0=1
  • 再往左 000×21=00\times 2^1=0
  • 再往左 111×22=41\times 2^2=4
  • 最左边 111×23=81\times 2^3=8

相加:8+4+0+1=138+4+0+1=13
结论:11012=13101101_2=13_{10}

示例 2:把 2E2E(十六进制)转十进制

这里 base=16base=16,并且 E=14E=14

从右往左:

  • 最右边 EE14×160=1414\times 16^0=14
  • 再往左 222×161=322\times 16^1=32

相加:32+14=4632+14=46
结论:2E16=46102E_{16}=46_{10}


3.2.2 方法 2:从左到右“乘 base 加当前位”(秦九韶法)

an1an2a1a0a_{n-1}a_{n-2}\cdots a_1a_0 当成从左到右读入:

  1. 先令 ans=0ans=0
  2. 每读到一位 aia_i

ans=ans×base+aians = ans \times base + a_i

  1. 读完所有位后,ansans 就是十进制值

本质等价于:

(((an1)base+an2)base+an3)+a0(((a_{n-1})\cdot base + a_{n-2})\cdot base + a_{n-3})\cdots + a_0


示例 3:把 11011101(二进制)从左到右转十进制

这里 base=2base=2,从左到右读:1,1,0,11,1,0,1

  • 初始:ans=0ans=0
  • 读到 11ans=0×2+1=1ans=0\times 2+1=1
  • 读到 11ans=1×2+1=3ans=1\times 2+1=3
  • 读到 00ans=3×2+0=6ans=3\times 2+0=6
  • 读到 11ans=6×2+1=13ans=6\times 2+1=13

结论:11012=13101101_2=13_{10}


示例 4:把 2E2E(十六进制)从左到右转十进制

这里 base=16base=16E=14E=14,从左到右读:2,E2,E

  • 初始:ans=0ans=0
  • 读到 22ans=0×16+2=2ans=0\times 16+2=2
  • 读到 E(14)E(14)ans=2×16+14=46ans=2\times 16+14=46

结论:2E16=46102E_{16}=46_{10}

四、小数部分的进制转换

4.1 十进制小数 \rightarrow basebase 进制小数

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

对十进制小数 xx0x<10\le x < 1):
1)x×basex \times base
2)取“整数部分”作为小数点后的下一位
3)保留小数部分继续
4)重复若干次或小数部分为 00

示例:0.6250.625(十进制)转二进制(base=2base=2

0.625×2=1.250.625 \times 2 = 1.25,取 11,剩 0.250.25
0.25×2=0.50.25 \times 2 = 0.5,取 00,剩 0.50.5
0.5×2=1.00.5 \times 2 = 1.0,取 11,剩 00
结论:0.6250.625(十进制)== 0.1010.101(二进制)

重要提醒:
有些小数会“无限循环”,例如 0.10.1(十进制)转二进制不会有限结束。
因此题目通常会要求:保留 NN 位或允许误差。


4.2 basebase 进制小数 \rightarrow 十进制小数

以二进制为例,小数点后:

  • 11 位表示 12\dfrac{1}{2}
  • 22 位表示 14\dfrac{1}{4}
  • 33 位表示 18\dfrac{1}{8}
  • 以此类推

示例:0.1010.101(二进制)转十进制
=1×12+0×14+1×18= 1\times \dfrac{1}{2} + 0\times \dfrac{1}{4} + 1\times \dfrac{1}{8}
=0.5+0+0.125= 0.5 + 0 + 0.125
=0.625= 0.625

【前置知识点】
1、数学

【后置衔接知识点】
1、位运算

【思维导图】

【题目知识点分类】