尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

专升本计算机基础:二进制、八进制、十六进制转换技巧与Python验证

专升本计算机基础:二进制、八进制、十六进制转换技巧与Python验证 备考专升本的同学们在《计算机基础》这门课里进制转换是第一章就会遇到、也是必须拿满分的考点之一。很多同学看到二、八、十六进制互转的题目第一反应是“我会”但真正动笔时不是余数顺序写反就是小数点补零方向搞错最后在不起眼的地方被扣分。这篇文章不是单纯讲定义而是把“二、八、十六进制互转”这一课完整拆开先搞清楚进制是什么、为什么计算机偏爱二进制再给出所有转换方法配上手写算例最后用 Python 写一个可以自测的进制转换小工具并整理专升本高频易错点和课后练习。无论你在山东、四川、江西、河北、辽宁、甘肃、内蒙、重庆还是天津备考这套核心知识点都是通用的。1. 进制转换为什么是计算机基础的“必考点”1.1 从计数习惯说到进制本质我们平时最熟悉的数字是十进制也就是“逢十进一”。从幼儿园学数数开始我们用 0、1、2、3、4、5、6、7、8、9 这十个符号表示所有的数。为什么是十个符号因为人有十根手指这是最朴素的计数习惯。那计算机为什么不直接用十进制因为计算机是由逻辑电路构成的电路只有两种稳定状态有电和没电、高电平和低电平。用数字表示就是 1 和 0。所以计算机内部天然使用的是二进制也就是“逢二进一”。二进制只有 0 和 1 两个符号和电路的开、关状态完美对应。所谓“进制”本质上就是“计数过程中满多少就向前进位”的规则。十进制满十进一二进制满二进一八进制满八进一十六进制满十六进一。不同进制只是同一个数值的不同“写法”就像同一个馒头既可以按“个”数也可以按“斤”称数字大小不会变。1.2 为什么还要学八进制和十六进制既然计算机用二进制为什么不干脆只学二进制因为二进制写起来太长了。举个例子十进制数 255 写成二进制是 11111111八个 1 挨在一起读写都很容易出错。如果数字更大比如 65535写成二进制就是十六个 1肉眼几乎没法快速确认位数。于是工程师们引入了两个“中间进制”八进制和十六进制。八进制逢八进一只用 0 到 7十六进制逢十六进一用 0 到 9 和 A、B、C、D、E、F 六个字母。巧妙的是二进制、八进制、十六进制之间是整倍数关系一位八进制数恰好对应三位二进制数一位十六进制数恰好对应四位二进制数。所以二进制可以每三位或每四位一组快速翻译成更短、更利于人类阅读的八进制或十六进制。在专升本《计算机基础》考试中进制转换通常会出现在“计算机概述”“数制与编码”部分题型包括单选题、填空题和简单的计算题。它属于典型的“会者不难、难者不会”的内容只要方法正确、细心做题完全是送分题。1.3 本节需要掌握到什么程度学完这一课你至少要达到以下水平能正确说出二进制、八进制、十进制、十六进制的基数以及它们各自使用的符号集合。会用“按权展开法”把任意进制数转换成十进制数。会用“除基取余法”把十进制整数转换成任意进制整数。会做分组转换二进制与八进制、二进制与十六进制互转。会处理小数部分乘基取整法、按权展开法带负次幂计算。知道八进制与十六进制不能“直接互转”必须先经过二进制或十进制。下面我们从最基础的两个概念开始。2. 必备前置概念基数与位权2.1 基数是什么基数Radix 或 Base是指一个数制中允许使用的数字符号个数。举个例子二进制基数 R 2只允许出现 0 和 1。八进制基数 R 8允许出现 0、1、2、3、4、5、6、7。十进制基数 R 10允许出现 0 到 9。十六进制基数 R 16允许出现 0 到 9 以及 A、B、C、D、E、F。判断一个数是不是合法的某进制数标准就是看它有没有用超出该进制范围的符号。比如 102 这个数它可以是十进制、八进制、十六进制但绝不可能是二进制因为二进制里不允许出现数字 2。同理一个包含字母 A 的数字串只可能是十六进制因为 A 表示十进制的 10。2.2 位权是什么位权Weight是指同一个数字在不同数位上所代表的实际值倍数。以十进制数 123 为例百位的 1 代表 1×10² 100十位的 2 代表 2×10¹ 20个位的 3 代表 3×10⁰ 3这里的 10²、10¹、10⁰ 就是位权。位权的大小等于“基数的小数点向左偏移的次方”。小数点向左第 n 位位权是 Rⁿ小数点向右第 n 位位权是 R⁻ⁿ。位权这个概念决定了进制转换的核心算法。任意进制数转十进制其实就是一个“按位权展开、再求和”的过程。2.3 按权展开法的通用公式设一个 R 进制数为整数部分有 n 位... a₃ a₂ a₁ a₀ 小数部分有 m 位b₁ b₂ b₃ ...那么它对应的十进制数值为N aₙ₋₁·Rⁿ⁻¹ ... a₂·R² a₁·R¹ a₀·R⁰ b₁·R⁻¹ b₂·R⁻² ...记住这个公式后面所有进制转十进制的题目都能套。举个例子二进制数 1011 转十进制1×2³ 0×2² 1×2¹ 1×2⁰ 8 0 2 1 11这个展开过程就是“按权展开”。下面我们系统学习各进制之间的转换方法。3. 二、八、十六进制之间的“亲戚关系”3.1 一张表记住核心对应关系二进制转八进制、二进制转十六进制之所以可以“分组快速转换”是因为 2³ 8、2⁴ 16。记住下面两张基础表做题速度会明显提升。八进制数字与三位二进制对应表八进制二进制八进制二进制00004100100151012010611030117111十六进制数字与四位二进制对应表十六进制二进制十六进制二进制0000081000100019100120010A101030011B101140100C110050101D110160110E111070111F1111两张表不需要死记硬背多转换几次自然就熟了。尤其是 0000 到 1111 这十六个四位组合强烈建议你亲手写一遍。3.2 为什么一位八进制恰好等于三位二进制因为八进制最大的数字是 7需要三位二进制才能表示111 7。反过来三位二进制最多能表示 2³ 8 种状态刚好是 0 到 7与八进制每一位的取值范围完全吻合。所以二进制转八进制时从右往左每三位二进制数即可直接替换成一位八进制数不需要做任何额外计算。同理四位二进制能表示 2⁴ 16 种状态刚好对应十六进制的 0 到 F。这种“进制基数互为 2 的幂次”的特性让二、八、十六进制之间的转换变成了一道“查表 补零”的题本质上比转十进制还简单。4. 八种转换场景逐一拆解4.1 二进制转十进制方法按权展开求和。以二进制数 110101.101 为例先把它分成整数部分 110101 和小数部分 101然后分别展开。整数部分1×2⁵ 1×2⁴ 0×2³ 1×2² 0×2¹ 1×2⁰ 32 16 0 4 0 1 53小数部分1×2⁻¹ 0×2⁻² 1×2⁻³ 0.5 0 0.125 0.625两部分相加53 0.625 53.625所以 110101.101B 53.625D。注意小数第 1 位是 2⁻¹也就是 0.5第 2 位是 0.25第 3 位是 0.125每往右一位位权缩小一半。这是二进制小数转十进制最容易踩坑的地方指数是负的不是正的。4.2 十进制转二进制十进制整数转二进制用“除 2 取余逆序排列”。也就是把十进制数不断除以 2记录每次的余数直到商为 0最后把余数从下往上倒着写出来。把 53 转成二进制53 ÷ 2 26 余 1 26 ÷ 2 13 余 0 13 ÷ 2 6 余 1 6 ÷ 2 3 余 0 3 ÷ 2 1 余 1 1 ÷ 2 0 余 1余数从下往上排列110101和刚才二进制转十进制的结果一致说明转换正确。十进制小数转二进制用“乘 2 取整顺序排列”。以 0.625 为例0.625 × 2 1.25 取整数部分 1余下 0.25 0.25 × 2 0.5 取整数部分 0余下 0.5 0.5 × 2 1.0 取整数部分 1余下 0整数部分从上往下排列得到 101加在小数点后面0.101B。注意这里顺序是“正序”和整数部分“逆序”刚好相反很多同学会在这里混淆。如果十进制小数乘 2 后一直取不干净说明二进制小数可能无限循环题目通常会限定保留位数比如“保留 4 位小数”这时要按四舍五入处理但二进制里只有 0 和 1进位规则需要特别留意。4.3 二进制转八进制方法三位分组法。规则是整数部分从右往左每三位一组不足三位在左边补 0小数部分从左往右每三位一组不足三位在右边补 0。最后将每一组三位二进制数替换成对应的八进制数字。把 110101.101B 转八进制先看整数部分 110101从右往左分组110 101左起第一组 110 对应八进制 6第二组 101 对应八进制 5所以整数部分八进制是 65。再看小数部分 101从左往右分组正好三位101对应八进制 5。所以 110101.101B 65.5O有些书用 Q 表示八进制读法相同。注意八进制的后缀字母有 O 和 Q 两种写法O 容易和数字 0 混淆很多考试题用 Q 来避免歧义两种都要认得。4.4 八进制转二进制方法把每一位八进制数字替换成三位二进制数去掉最左边多余的 0。把 65.5O 转二进制6 → 110 5 → 101 . → . 5 → 101得到 110101.101B和刚才的例题形成闭环。如果八进制数字是 3那就要写 011形成三位完整的二进制数。比如 376O 转二进制3 → 011 7 → 111 6 → 110拼接起来是 011111110B去掉最左边的 0结果是 11111110B。注意这里每一位八进制都必须展开成三位二进制哪怕首位的 3 展开后是 011也不能写成 11。4.5 二进制转十六进制方法四位分组法。规则和八进制类似但每次取四位。整数部分从右往左不足四位左边补 0小数部分从左往右不足四位右边补 0。把 110101.101B 转十六进制。先看整数部分 110101从右往左分组11 0101最左边只有两位补 0 成四位于是变成 0011 0101。0011 对应 30101 对应 5整数部分十六进制为 35。再看小数部分 101只有三位补 0 成 1010对应十六进制 A。于是 110101.101B 35.AH。这里提醒一句十六进制中 10 到 15 分别记作 A、B、C、D、E、F不要写成 10因为十六进制中“10”是十六进制的 16而不是 10。这是初学者特别容易忽视的地方。4.6 十六进制转二进制方法把每一位十六进制数字替换成四位二进制数去掉最左边多余的 0。把 3F0A H 转二进制3 → 0011 F → 1111 0 → 0000 A → 1010拼接起来得到 0011111100001010B去掉最左边两个 0结果是 11111100001010B。注意每一位十六进制都必须写满四位中间的 0 一个都不能省。4.7 八进制与十六进制互转间接转换八进制和十六进制之间没有直接的对应关系不能像二转八那样直接分组。通常有两种做法方法一八进制先转二进制再按四位分组转十六进制。方法二八进制先转十进制再除 16 取余转十六进制。以 65.5O 转十六进制为例用方法一65.5O 先转二进制得到 110101.101B然后按四位分组整数部分 110101 → 0011 0101 → 35 小数部分 101 → 1010 → A结果是 35.AH。需要特别说明的是有的同学想直接套用“三位变四位”的想法从八进制直接读十六进制这是不行的。八进制到十六进制没有整倍数的位权关系必须借助二进制或十进制中转。考试时如果出现这类题先写中转过程不要在试卷上直接跳步。4.8 十进制与八进制、十六进制的互转十进制转八进制整数部分用“除 8 取余逆序排列”小数部分用“乘 8 取整顺序排列”。十进制转十六进制整数部分用“除 16 取余逆序排列”小数部分用“乘 16 取整顺序排列”。原理和十进制转二进制完全一致只是除数或乘数换了。把十进制 123.375 转二进制先按前面方法处理整数 123 转二进制123 ÷ 2 61 余 1 61 ÷ 2 30 余 1 30 ÷ 2 15 余 0 15 ÷ 2 7 余 1 7 ÷ 2 3 余 1 3 ÷ 2 1 余 1 1 ÷ 2 0 余 1逆序得 1111011B。小数 0.375 转二进制0.375 × 2 0.75 取 0 0.75 × 2 1.5 取 1 0.5 × 2 1.0 取 1顺序得 011B。所以 123.375D 1111011.011B。接着转八进制整数部分 1111011 从右往左三位分组先补 0 成 001 111 011对应 173小数部分 011 对应 3所以八进制是 173.3O。转十六进制整数部分 1111011 从右往左四位分组补 0 成 0111 1011对应 7B小数部分 011 补 0 成 0110对应 6所以十六进制是 7B.6H。这就把同一个数用四种进制表达了核心意思是不管用什么进制书写数值大小不变。4.9 小数部分转换总结小数的进制转换是专升本考试的区分点把规则总结成几句话任意进制小数转十进制按权展开小数位权重为 2⁻¹、2⁻²、2⁻³ 等。十进制小数转任意进制乘基取整顺序排列。二进制转八进制小数部分从左往右每三位一组不足三位右边补 0。二进制转十六进制小数部分从左往右每四位一组不足四位右边补 0。如果小数乘基后始终不能归零通常题目会指定保留位数按“0舍1入”的近似方法处理。“整数部分和小数部分补 0 方向相反”是最高频的错误点做题时可以在草稿纸上标注清楚方向避免低级失误。5. 综合实战用 Python 写一个进制转换工具5.1 需求设计理解了手动计算方法以后再用代码实现一遍能帮你加深对位权、取余、分组等核心概念的理解。这里用 Python 实现一个“进制转换器”支持二进制、八进制、十进制、十六进制之间的整体转换。工具拆分成三个函数校验函数判断输入数字串是否属于当前进制。任意进制转十进制模拟按权展开法。十进制转任意进制模拟除基取余法。这样的设计思路也贴合正规软件工程的做法先拆功能再写代码。5.2 核心代码实现新建一个文件命名为base_converter.py写入下面的代码# 文件路径base_converter.py DIGITS 0123456789ABCDEF def validate(number, base): 检查数字串在当前进制下是否合法 for char in number.upper(): if char not in DIGITS or DIGITS.index(char) base: return False return True def to_decimal(number, base): 任意进制字符串转十进制整数模拟按权展开 number number.upper() result 0 for char in number: result result * base DIGITS.index(char) return result def from_decimal(decimal, base): 十进制整数转任意进制字符串模拟除基取余 if decimal 0: return 0 result [] n decimal while n 0: result.append(DIGITS[n % base]) n // base return .join(reversed(result)) def convert(number, source_base, target_base): 通用进制转换入口 if not validate(number, source_base): return None decimal_value to_decimal(number, source_base) return from_decimal(decimal_value, target_base) if __name__ __main__: tests [ (110101, 2, 8), (110101, 2, 16), (65, 8, 16), (376, 8, 2), (3F0A, 16, 2), (7B, 16, 10), ] for num, src, dst in tests: result convert(num, src, dst) print(f{num} ({src}进制) - {result} ({dst}进制))代码里的DIGITS.index(char)可以找到字符对应的数值比如DIGITS.index(F)返回 15。to_decimal函数每次把已有结果乘上基数再加上当前位的值这正对应按权展开的计算过程from_decimal函数不断取余并整除最后逆序拼接对应除基取余法。5.3 运行与验证在命令行运行python base_converter.py预期输出110101 (2进制) - 65 (8进制) 110101 (2进制) - 35 (16进制) 65 (8进制) - 35 (16进制) 376 (8进制) - 11111110 (2进制) 3F0A (16进制) - 11111100001010 (2进制) 7B (16进制) - 123 (10进制)这些结果和前面手算的答案完全一致。你可以在tests列表里随意添加新数据比如把(1010.101, 2, 16)这种带小数的题目先交给代码处理就会发现当前版本只支持整数这也是留给你的扩展练习为转换器增加小数部分支持把位权改为负数次幂。实现代码最大的价值不是替代手算而是帮你验证手算结果。备考阶段你可以拿练习题先手算再用这个工具检查两边结果一致说明方法掌握牢固了。6. 专升本高频考点与易错点排查6.1 常见考题形式进制转换在专升本试卷里通常以这样几种形式出现直接转换给出一个二进制数要求转换成八进制、十进制或十六进制。范围判断问 n 位二进制能表示的最大无符号整数是多少比如 8 位二进制最大是 2⁸ - 1 255。合法性判断问 102、18H、78O 这些写法是否合法。比如 78O 不合法因为八进制不允许出现数字 818H 合法因为十六进制允许 1 和 8。混合计算给一个十六进制表达式比如 2F 10要求先转十进制计算再把结果转回十六进制。这些题目万变不离其宗本质都是进制转换基本功。6.2 高频易错点表格易错场景错误示范错误原因正确做法十进制转二进制除 2 取余后正序写出余数余数排列方向搞反余数从下往上逆序排列二进制小数转十六进制小数部分在左边补 0小数侧补 0 方向错误小数部分向右补 0二进制转八进制从左往右三位一组分组方向错误整数部分从右往左分组八进制转十六进制尝试直接对照表转换没有直接对应关系先转二进制或十进制再转十六进制中 10 的写法把十进制 10 写成 16 进制 A混淆数值与写法A 表示十进制 10一位十六进制转二进制把 F 写成 1111没有补足四位F → 1111必须四位写结果后缀忘记写 B、O/Q、D、H不重视书写规范结果按规范补后缀考试中往往不是你不会转换而是这些细节拖了后腿。建议把表格里的错误场景抄在笔记本上每次做完进制转换题都对照检查一遍。7. 答题提速技巧与记忆口诀7.1 十六进制字母记忆十六进制的 A 到 F 对应十进制 10 到 15可以通过一句话记忆A10、B11、C12、D13、E14、F15。字母顺序和英文字母表顺序一致所以只需要额外记住 A 代表 10剩下的往后数就行。如果一个数里含有 A、B、C、D、E、F 中的任意字母你基本可以断定它是十六进制。这时不要再去考虑八进制或十进制直接按十六进制处理即可。7.2 快速分组技巧二转八、二转十六是考试中速度差距最大的两个操盘点二进制转八进制以小数点为界整数部分向左每三位画一条竖线小数部分向右每三位画一条竖线直接写对应数字。看到 10110110 可以先写出来从右往左分10 110 110左端补 0 成 010 110 110对应 266O。二进制转十六进制分组规则变成四位看到 10110110 从右往左分1011 0110对应 B6H。这种分组法摆脱了逐位计算的思路熟练掌握后看到一长串二进制就能像读十进制数一样直接“读”出八进制或十六进制结果。7.3 做题检查清单每次做完进制转换题花十秒做一次自查后缀写了吗二进制写 B八进制写 O/Q十进制写 D十六进制写 H。补 0 方向对吗整数左补、小数右补。十进制转进制时余数是逆序吗小数是正序吗十六进制字母大写了吗A 到 F 不会和数字 1、0 混淆如果有小数负次幂的位权算对了吗这套检查清单看起来简单却能有效减少“会做但丢分”的情况。8. 课后练习与参考答案8.1 练习题将二进制数 110101.101 转换为八进制、十六进制和十进制。将八进制数 376 转换为二进制、十进制和十六进制。将十六进制数 3F0A 转换为二进制、八进制和十进制。将十进制数 123.375 转换为二进制、八进制和十六进制。判断下列说法是否正确并说明理由八进制数 789 合法。十六进制数 10 等于十进制数 10。二进制数 1011 与十六进制数 B 相等。8.2 参考答案与解析第 1 题110101.101B转八进制110 101 . 101 → 65.5O转十六进制0011 0101 . 1010 → 35.AH转十进制32 16 4 1 0.5 0.125 53.625D第 2 题376O转二进制3→0117→1116→110拼接后去掉前导 0得 11111110B。转十进制128 64 32 16 8 4 2 254D。转十六进制1111 1110得 FEH。第 3 题3F0AH转二进制3→0011F→11110→0000A→1010拼接后去掉前导 0得 11111100001010B。转八进制从右往左三位分组011 111 100 001 010得 37412O。转十进制3×4096 15×256 0×16 10 12288 3840 0 10 16138D。第 4 题123.375D转二进制整数除 2 取余得 1111011小数乘 2 取整得 011结果 1111011.011B。转八进制整数 001 111 011 → 173小数 011 → 3结果 173.3O。转十六进制整数 0111 1011 → 7B小数 0110 → 6结果 7B.6H。第 5 题八进制数 789 不合法因为八进制只允许 0 到 7数字 8 和 9 都越界了。十六进制数 10 不等于十进制数 10。十六进制 10 表示 1×16¹ 0×16⁰ 16D。二进制数 1011 等于十六进制数 B因为 1011B 8 2 1 11D而 B 在十六进制中也表示 11。这一课的内容本身不难但它是后续学习原码、反码、补码、ASCII 编码、IP 地址计算的基础。如果每次做题都能按“先判断进制合法性再选择转换方法最后补全后缀”的流程走进制转换基本不会丢分。建议把第 8 节的练习题放到一周后再做一遍检验是否真的形成了长期记忆。
返回列表