第 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 |
💡 记忆技巧:死记 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 100010 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 |
💡 这其实就是用一个栈接收每轮余数、再出栈——逆序输出。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
能观察到两个不同点:
- 这回取下的是整数部分,小数部分留下进入下一轮乘法;
- 取出的整数顺序放在小数点后面(不逆序)。
十六进制 → 十进制
用 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
十进制 → 二进制
直接上带小数的例子: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 位结果肯定出来了。
比如这道题:以下二进制的值与十进制 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₍₈₎
八进制与其他
二 ↔ 八
八进制其实就是把二进制 3 位 3 位地取,和十六进制 4 位一组一个道理。
例:二进制 11 1100 0010 换八进制——3 位一组、左边补零:
001 111 000 010 → 1702₍₈₎
八换二反过来:每位八进制展开成 3 位二进制(要记的东西和十六那套同理)。
八 ↔ 十六
十六换八:以二进制为桥。
例:F2C4B 换八进制
- 先展开成二进制:
1111 0010 1100 0100 1011 - 从右往左 3 位一组、左边补零:
011 110 010 110 001 001 011 - → 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 码
- 标准 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 字形码。输出汉字时,先根据机内码找到字模信息在汉字库中的位置,取出点阵字形显示/打印——机内码负责"找",字形码负责"画"。
💬 评论