--- title: "01-进制与编码" created: 2026-08-29 tags: - 基础与理论 - 信息基础大赛 --- # 第 1~10 题:进制和编码 > 📚 本文是 [[00-信息基础大赛|信息基础大赛]](10.29 备赛)的第 1 篇,题目以截图为主、文字为点拨。 > 💡 要系统学透对应知识,配合:[[00-信息的表示与处理|信息的表示与处理]] **战术定位**: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.jpeg]] 💡 记忆技巧:**死记 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 0011` → **0x3CADB3** 再练两组: - `0x39A7F8` → `0011 1001 1010 0111 1111 1000` - `10 0110 1110 0111 1011 0101` → 补齐 `0010 0110 1110 0111 1011 0101` → **0x26E7B5** **带小数**:小数点后的部分**从左往右** 4 位一组,**右边**补 0(方向和整数部分正好相反)。 例:`101.01011₂` → 整数 `101`→`0101`→5;小数 `01011`→`0101 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.png]] 💡 这其实就是**用一个栈接收每轮余数、再出栈**——逆序输出。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¹ | 2⁰ | | 2⁻¹ | 2⁻² | 1×2⁵ + 1×2³ + 1×2⁰ + 1×2⁻¹ + 1×2⁻² = 32 + 8 + 1 + 0.5 + 0.25 = **41.75** ![[image3.png]] #### 十进制 → 二进制 直接上带小数的例子: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.png]] 比如这道题:以下二进制的值与十进制 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.png]] #### 二 ↔ 八 八进制其实就是把二进制 **3 位 3 位**地取,和十六进制 4 位一组一个道理。 ![[image6.png]] 例:二进制 `11 1100 0010` 换八进制——3 位一组、左边补零: `001 111 000 010` → **1702₍₈₎** 八换二反过来:每位八进制展开成 3 位二进制(要记的东西和十六那套同理)。 #### 八 ↔ 十六 十六换八:**以二进制为桥**。 ![[image7.png]] 例: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.png]] - 标准 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-信息基础大赛|总览]] 🏠 [[00-信息基础大赛]] ➡️ [[02-离散数学|下一篇]]