
进制转换这一课在专升本计算机基础里常常被当成第一章的送分题。可真正考过的人都知道送分题最容易丢分背了二转八的规则遇到二转十六又要重新想八进制转二进制知道拆成三位十六进制转二进制又忘了拆成四位碰到小数部分补零方向一犹豫错得反而更快。更麻烦的是很多备考资料把二、八、十六进制互转拆成四五套口诀看起来都能用一遇到具体题目就卡壳。在专升本计算机基础、计算机基础与程序设计这类课程里进制转换通常放在第一章表面上只考几道小题实际上它会影响后面很多章节的理解。我后来才发现问题不在记忆而在理解。二、八、十六进制之所以能快速互转不是规则凑巧而是因为 8 和 16 都恰好是 2 的整数次幂8 等于 2 的三次方16 等于 2 的四次方。这句话才是整节课的地基。只要把「位置权重」「分组方向」「补零规则」这三件事想透二、八、十六进制互转就不再是需要背的套路而是一个可以重复执行的流程。这篇讲义性质的博客就把这个过程完整拆开讲清楚每一步为什么要这么做以及刷题时最容易被什么坑绊倒。1. 先搞清楚一个基本问题进制到底在数什么1.1 位置计数法每一位其实都有一个“单位”以十进制为例。1234 在我们眼里是一个数但拆开看它其实是四位的值按位权相加1 在千位表示 1 个 10002 在百位表示 2 个 1003 在十位表示 3 个 104 在个位表示 4 个 1。如果写成公式就是1234 1×10^3 2×10^2 3×10^1 4×10^0这里的 10 是十进制的基数每个位置的权重从右往左依次是 1、10、100、1000也就是 10 的 0 次幂、1 次幂、2 次幂、3 次幂。二进制、八进制、十六进制也一样只是基数不同二进制的基数是 2每位的权重是 1、2、4、8、16……每个位置只能出现 0 或 1。八进制的基数是 8每位的权重是 1、8、64、512……每个位置能出现 0 到 7。十六进制的基数是 16每位的权重是 1、16、256、4096……每个位置能出现 0 到 15其中 10 到 15 用 A、B、C、D、E、F 表示。之所以强调这个基础是因为很多同学在做互转时会把数字直接搬到新进制里比如认为二进制 1010 写成八进制就是 1010这其实没有理解进位规则。任何进制都不是把符号原样平移而是要先搞清楚每一位代表的“单位”变了多少。1.2 8 和 16 为什么能直接对应二进制现在可以回答最核心的问题为什么偏偏是八进制和十六进制而不是七进制或九进制因为 8 2³一位八进制数恰好能表示 0 到 7而 3 位二进制数正好也有 2³8 种组合000、001、010、011、100、101、110、111。因此一位八进制数可以精确对应到三位二进制数不多不少。十六进制同理。16 2⁴一位十六进制数恰好能对应四位二进制数。二进制数每四位一组正好有 2⁴16 种组合也就是十六进制里用到的 0 到 9、A 到 F。这就是整节课最关键的一条主线二转八实质是把二进制按 3 位分组二转十六实质是按 4 位分组。反过来八转二就是把每一位八进制数字展开成 3 位二进制十六转二就是把每一位十六进制数字展开成 4 位二进制。1.3 一份最常用的对照表为了方便后面展开先把最常用的 16 组值列出来。这个表在刷题时会反复用到不要求死背但要能快速查。十进制二进制八进制十六进制00000001000111200102230011334010044501015560110667011177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F看到这里可能有人会问为什么十进制 8 在八进制里是 10因为八进制没有数字 8所以 7 加 1 之后必须进位变成 10代表一个 8而不是“十”。这个细节在考试里很容易被故意设计成易错项。2. 二进制转八进制和十六进制分组比逐位计算更快铺垫做完可以进入第一组核心操作。很多教材会先教二进制转十进制再用十进制转八进制或十六进制也就是“绕道十进制”。这种做法不是不行但慢而且中间多一步就多一分出错概率。在试卷时间有限的情况下建议直接掌握分组法。2.1 整数部分从小数点往左三位或四位一组二进制转八进制整数部分的操作是“从右往左”三位一组也就是从最靠近小数点的位置往左数。举一个例子。二进制数 10110110 转八进制从右边开始每三位分组10 110 110注意最高位只剩下两位。位数不足三位时在左侧补一个 0010 110 110。每一组三位二进制对应一位八进制010 是 2110 是 6110 是 6。最后结果按顺序写下来266₈。二进制转十六进制思路完全相同只是改成四位一组。还是 10110110从右边开始每四位分组1011 0110。分组本身刚好够四位不需要补零。1011 是 B0110 是 6。结果就是 B6₁₆。注意如果整数位数是 5 位比如 10110转十六进制时要先从右往左分1 0110发现最左边只有一位要在左边补三个零变成 0001 0110然后才对 0001 和 0110 分别取值。这里的核心是分组起点在右边靠近小数点补零方向在左边不影响整数大小。2.2 小数部分从小数点往右三位或四位一组小数的分组方向刚好和整数反过来。小数部分要从紧挨小数点的那一位开始往右分组不足时在右边补零。比如二进制 0.110101 转八进制整数部分是 0先写下来。小数部分从左边开始三位一组110 101。两组刚好三位不需要补零。110 是 6101 是 5结果是 0.65₈。再看一个需要补零的例子。二进制 0.1011 转十六进制整数部分是 0先写下来。小数部分从左开始四位一组1011刚好四位。结果是 0.B₁₆。如果二进制是 0.101 转十六进制只有三位不足四位就必须在右侧补一个 0变成 1010对应 A结果是 0.A₁₆。这里容易有个错觉明明题目给的是 0.101为什么写成 0.A 而不是 0.5因为十六进制里每一位对应的是四位二进制二进制 101 在小数部分必须补足四位后再取值补零在右边是为了保持数值不变。2.3 分组不足时补零要补在哪里直接把结论收一下整数部分分组从右往左不足三位或四位时在最左边补零。小数部分分组从左往右不足三位或四位时在最右边补零。可以这样理解整数部分的高位补零相当于在 1024 这种数前面加几个 0不影响大小小数部分的低位补零相当于在小数点后最后一位再补几个零也不影响大小。但如果不补零就直接转换输出结果会错位后面的步骤全白做。注意很多同学会把“从右往左分组”理解成“从数字最右端往外数”这本身没错但一旦遇到小数就必须改成从小数点两侧向外数。整数和小数分组方向不一致这是最容易翻车的地方。3. 反向转换八进制、十六进制转二进制最容易栽在补位 0 上正向转换会分组反向转换很多人也懂“一位拆成三位或四位”但做完总是差一位或两位。问题通常不在拆位而在拼接时把每一组内部的补位 0 丢掉了。3.1 一位展开成三位或四位拆完直接拼接八进制转二进制只要把每 1 位八进制数字展开成 3 位二进制数字然后按顺序拼接起来。例如八进制 326 转二进制3 拆成 0112 拆成 0106 拆成 110拼接011010110去掉整数部分最左边多余的 0得到 11010110。如果你把 3 拆成 112 拆成 106 拆成 110再拼接成 1110110那就错了。错在哪错在每一位八进制数字对应的二进制必须占满 3 位哪怕这个数字很小也要写成 001、010、011 这种形式。十六进制转二进制同理只是每 1 位十六进制数字要展开成 4 位二进制。例如十六进制 D6 转二进制D 拆成 11016 拆成 0110拼接11010110最左边没有多余前导零结果就是 11010110。3.2 不要丢掉任何一组的“内部补位 0”反向转换里最隐蔽的坑就是中间的 0 被丢掉。举一个被反复考过的例子八进制 271 转二进制。正确的做法是2 拆成 0107 拆成 1111 拆成 001拼接成 010111001去掉最左边的前导 0得到 10111001。注意第 1 步的 2 写成 010第 3 步的 1 写成 001。如果漏掉了 010 里的第一个 0或者把 001 写成 1结果就会变成 101111 或更短的串长度都不对答案自然错。我一般会让学生在拼接完成后先数一数字符数。一个三位八进制数转成二进制后不省略前导零时应该有 9 位去掉最左边的前导零后也至少是 8 位左右。如果最后二进制串长度比预期短很多基本可以断定中间丢 0 了。校验方式每 1 位八进制都严格占满 3 位每 1 位十六进制都严格占满 4 位再统一去掉最外层多余的前导零。注意不要只看最前面的 0 就顺手省掉。中间的补位 0 一旦省略数值会立刻错位。丢掉前导零不会改变大小但丢掉中间位等价于把一个数从百位写成十位结果完全不同。3.3 遇到非法数字先停下来确认输入八进制的合法数字只有 0 到 7十六进制的合法数字是 0 到 9 和 A 到 F。如果在八进制数里看到 8 或 9或者在十六进制数里看到简写但没写清楚是哪一个字符都要先回头确认原题。这不是小事。很多上机题会把输入写成字符串比如“0x2F”表示十六进制但如果题目把 0x 漏掉了直接用 int 转换就很容易得到错误结果。在笔试里如果题目是八进制那么这个数就不可能包含数字 8 或 9。出现这种字符说明要么题目抄错要么之前的进制判断错了。4. 八进制和十六进制互转最稳的路径是借道二进制很多同学在八进制和十六进制之间互转时习惯先转十进制再转目标进制。这条路不是不能用但计算量不稳定尤其数字一大乘法和除法轮番上反而不容易检查。4.1 为什么用二进制当跳板因为八进制和二进制之间是三位对应关系十六进制和二进制之间是四位对应关系。两者都与二进制有固定关系所以可以用二进制作为“中间货币”。例如八进制 326 转十六进制。直接转十六进制需要先算出八进制 326 的十进制值也就是 3×642×86214再不断除以 16。这个过程不复杂但一旦遇到带字母的十六进制不少人会卡在余数转换上。如果先借道二进制过程就变成八进制 326 → 二进制011 010 110 → 11010110二进制 11010110 → 十六进制1101 0110 → D6。两步都是标准操作不容易混淆。反过来十六进制 D6 转八进制也是一样D6 → 1101 0110 → 11010110 → 从右往左三位一组 → 011