第 1~10 题:进制和编码

📚 本文是 信息基础大赛(10.29 备赛)的第 1 篇,题目以截图为主、文字为点拨。 💡 要系统学透对应知识,配合:信息的表示与处理

战术定位:1~10 题就是进制转换和编码,这 10 分是稳拿的——下面两部分(离散、专利)搞定后,这类问题 90% 也就解决了。速度把控在 5 分钟以内:整数部分直接调计算器,小数算两位就能出答案。

进制转换问题(含小数)

一个字节由 8 位组成,二进制值域 0000 0000 ~ 1111 1111——写起来太冗长,用十进制转换又麻烦。于是用十六进制(hex,0x 开头)当中间层:把二进制数 4 位 4 位地拆分,用数字 0~9 和字符 A~F 表示 16 个可能的值。

16 个数码的二进制对照(全部换算的地基,必须秒答):

十六 二进制 十六 二进制
0 0000 8 1000
1 0001 9 1001
2 0010 A 1010
3 0011 B 1011
4 0100 C 1100
5 0101 D 1101
6 0110 E 1110
7 0111 F 1111
image1

💡 记忆技巧:死记 A=1010、C=1100、F=1111、4=0100、8=1000,剩下的 B、D、E 用相邻关系推(A+1=B,C+1=D,D+1=E)。

十六 ↔ 二

很少单独考这种题,一般都是与十进制混着转换;2、8、16 之间的互转主要看记忆和推算。

十六 → 二:每位展开成 4 位二进制。

例:0x173A4C

1 7 3 A 4 C
0001 0111 0011 1010 0100 1100

二 → 十六:整数部分从右往左 4 位一组,最左不足补 0。

例:11 1100 1010 1101 1011 0011 → 补齐 0011 1100 1010 1101 1011 00110x3CADB3

再练两组:

  • 0x39A7F80011 1001 1010 0111 1111 1000
  • 10 0110 1110 0111 1011 0101 → 补齐 0010 0110 1110 0111 1011 01010x26E7B5

带小数:小数点后的部分从左往右 4 位一组,右边补 0(方向和整数部分正好相反)。

例:101.01011₂ → 整数 1010101→5;小数 010110101 1000→5、8 → 5.58₁₆

十六 ↔ 十

(有种特殊速算方式,但多此一举,已删减——在《信息的表示与处理》里。)一般来说反复乘除法就够了。

十进制 → 十六进制:除 16 取余

x ÷ 16 = 商 q …… 余数 r,即 x = q×16 + r。r 作最低位,q 继续循环,直到商为 0;余数逆序排列。也叫"除 16 取余法"。

例:314156(D) = 4CB2C(H)

除法 余数 已得结果
314156 ÷ 16 19634 12 → C C
19634 ÷ 16 1227 2 2C
1227 ÷ 16 76 11 → B B2C
76 ÷ 16 4 12 → C CB2C
4 ÷ 16 0 4 4CB2C
image2

💡 这其实就是用一个栈接收每轮余数、再出栈——逆序输出。408 那篇笔记里用程序实现过这一过程。

带小数:拆成整数、小数两部分分别转。

例:58.75 转十六进制

  • 整数 58,除 16 取余:58÷16=3……10(A),3÷16=0……3 → 3A
  • 小数 0.75,乘 16 取整:0.75×16=12.00 → C;0.00×16=0.00 → 0 → .C0

能观察到两个不同点:

  1. 这回取下的是整数部分,小数部分留下进入下一轮乘法;
  2. 取出的整数顺序放在小数点后面(不逆序)。

十六进制 → 十进制

用 16 的幂乘以每个十六进制数字再求和。

例:7AF(H) = 1967(D)——从右往左 F 是第 0 位、A 第 1 位、7 第 2 位:

7×16² + 10×16¹ + 15×16⁰ = 1792 + 160 + 15 = 1967

⚠️ 计算量大,一般见不到这种题——题目基本都是十进制换其他。

十 ↔ 二、八

也是反复乘除法。

二进制 → 十进制

按权展开。例:100101.11

1 0 0 1 0 1 . 1 1
2⁵ 2⁴ 2⁰ 2⁻¹ 2⁻²

1×2⁵ + 1×2³ + 1×2⁰ + 1×2⁻¹ + 1×2⁻² = 32 + 8 + 1 + 0.5 + 0.25 = 41.75

image3

十进制 → 二进制

直接上带小数的例子:123.45,拆成 123 和 0.45。

整数部分,除 2 取余(余数逆序):

除法 余数 已得结果
123 ÷ 2 1 1
61 ÷ 2 1 11
30 ÷ 2 0 011
15 ÷ 2 1 1011
7 ÷ 2 1 11011
3 ÷ 2 1 111011
1 ÷ 2 1 1111011

小数部分,乘 2 取整(顺序往后接):

乘法 取整 已得结果
0.45 × 2 = 0.9 0 1111011.0
0.9 × 2 = 1.8 1 1111011.01
0.8 × 2 = 1.6 1 1111011.011
0.6 × 2 = 1.2 1 1111011.0111
0.2 × 2 = 0.4 0 1111011.01110
0.4 × 2 = 0.8 0 1111011.011100

还可以继续往下乘——反正就是取整数部分往后接、小数部分进下一轮(0.45 是无限循环小数,算到题目精度即可)。

🎯 考场节奏:一般算完整数部分就能排除两个答案;再算小数,算到 4、5 位结果肯定出来了。

image4

比如这道题:以下二进制的值与十进制 23.456 最接近的是?

选项:10111.0101 / 11011.1111 / 11011.0111 / 10111.0111

  • 整数 23:23÷2=11……1,11÷2=5……1,5÷2=2……1,2÷2=1……0,1÷2=0……1 → 10111(排除 11011 开头的两个)
  • 小数 0.456:0.456×2=0.912→0,0.912×2=1.824→1,0.824×2=1.648→1,0.648×2=1.296→1 → .0111

答案:10111.0111

推广:十进制换任意进制

  • 整数部分:除基数取余,余数逆序(换二除 2、换八除 8、换十六除 16)
  • 小数部分:乘基数取整,整数顺序接在小数点后

例:1770.625 换八进制

整数:除 8 取余 已得 小数:乘 8 取整 已得
1770 ÷ 8 = 221 …… 2 2 0.625 × 8 = 5.0 3352.5
221 ÷ 8 = 27 …… 5 52 0.0 × 8 = 0.0 3352.50
27 ÷ 8 = 3 …… 3 352
3 ÷ 8 = 0 …… 3 3352

3352.5₍₈₎

八进制与其他

image5

二 ↔ 八

八进制其实就是把二进制 3 位 3 位地取,和十六进制 4 位一组一个道理。

image6

例:二进制 11 1100 0010 换八进制——3 位一组、左边补零:

001 111 000 0101702₍₈₎

八换二反过来:每位八进制展开成 3 位二进制(要记的东西和十六那套同理)。

八 ↔ 十六

十六换八:以二进制为桥

image7

例:F2C4B 换八进制

  1. 先展开成二进制:1111 0010 1100 0100 1011
  2. 从右往左 3 位一组、左边补零:011 110 010 110 001 001 011
  3. 3626113₍₈₎

八换十六:同样走二进制桥,换成 4 位一组划分。

八 → 十

按权展开:3725₍₈₎ = 3×8³ + 7×8² + 2×8¹ + 5×8⁰ = 1536 + 448 + 16 + 5 = 2005

将算式转换成进制

还有一种把运算和进制转换结合起来的问题,比如:

11/128 用二进制数码序列表示为?

按老思路先算出十进制结果、再分整数小数两部分转换,很浪费时间。直接循环乘 2 除下去(分数形式):

步骤 结果 已得二进制
11/128 ×2 = 22/128 整数部分 0 0
22/128 ×2 = 44/128 0 00
44/128 ×2 = 88/128 0 000
88/128 ×2 = 176/128 1,留 48/128 0001
48/128 ×2 = 96/128 0 00010
96/128 ×2 = 192/128 1,留 64/128 000101
64/128 ×2 = 128/128 1,留 0,结束 0001011

0.0001011₂

💡 本质就是"乘 2 取整法"的分数形式:分子翻倍、分母不变,够 128 就吐出一个 1 并把 128 减掉。

编码问题

ASCII 码

image8
  • 标准 ASCII 用 7 位二进制表示一个字符,范围 0(0000000)~ 127(1111111
  • 但计算机中数据通常以 **8 位(1 字节)**存储:实际是 0 0000000 ~ 0 1111111最高位恒为 0,每个字符占一个字节的存储量
  • 大写字母的 ASCII 值比对应小写字母小 32(A=65,a=97)
  • 空格的 ASCII 值为 32,字符 0 为 48
  • 并非所有 ASCII 码都能显示成字符,前面的控制字符无法显示

💡 tips:按住 Alt 输入数字(十进制 ASCII 码),会显示对应字符。

  • 一个汉字 : 一个英文字符 = 2 : 1(微型机中汉字占 2 字节、英文占 1 字节)

例:一个 1.44MB 的文本文件,大约可存储多少中文字? 1.44×10⁶ B ÷ 2 B/字 = 72 万字(题目口径按 10⁶ 算;若按 1024 进位则约 75 万,考试认 72 万)

音码、形码、区位码

  • 音码(拼音输入法):按汉字发音编码,输拼音字母/音节,从候选列表选字。如输 "zhongguo" 选"中国"。
  • 形码:按汉字笔画构造和形状编码,按笔画顺序和部首输入。如五笔字型。
  • 音形码(形声码):字形 + 音韵结合编码,每个字的编码含部首和声母特征。
  • 区位码:按汉字在字符集中的位置编码,每个汉字一个唯一的四位十进制码。

汉字编码体系

  • 汉字编码:UTF-8、UTF-16、GB2312、GBK 等,不同编码的字节长度可以不同
  • 输入码:输入法生成、用于识别汉字的码——同一汉字在不同输入法下输入码不同、长度不同
  • 机内码:计算机内部表示汉字的编码——不同输入法输入的同一汉字,机内码相同(保持一致性)
  • Unicode:通用字符编码标准,跨输入法、跨系统保持字符一致,通常用 16 位或 32 位表示,容纳世界各种文字

区位码 → 国标码 → 机内码

换算链(考点)

区位码(十进制的区、位分别转两位十六进制)→ + 2020H → 国标码 → + 8080H → 机内码

例:汉字"家"的区位码是 2850,则其国标码是( ) A. 4870D B. 3C52H C. 9CB2H D. A8D0H

28 → 1CH,50 → 32H,得 2850 = 1C32H;1C32H + 2020H = 3C52H,选 B

(so:先分两部分换成十六进制,再加上 2020H。)

GB2312-80 的分级

  • 一级汉字 3755 个(常用),按汉语拼音排列,占 16~55 区
  • 二级汉字 3008 个(次常用),按偏旁部首排列,占 56~87 区
  • 每区 94 个汉字/符号;1~9 区是符号区(全角字母、希腊/日文/俄文、制表符号等),10~15、88~94 备用
  • 区位码是四位十进制数:前两位区码、后两位位码

显示/打印用哪个码?

显示或打印汉字时,系统使用的是汉字的( )。 A. 机内码 B. 字形码 C. 输入码 D. 国标码

答案:B 字形码。输出汉字时,先根据机内码找到字模信息在汉字库中的位置,取出点阵字形显示/打印——机内码负责"找",字形码负责"画"。

⬅️ 总览 🏠 00-信息基础大赛 ➡️ 下一篇