ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

进制转换全攻略:从位权原理到二进制十六进制速算技巧

进制转换全攻略:从位权原理到二进制十六进制速算技巧 先说个我自己的真实感受0xFF、0b1010、0755这种带前缀的数字十有八九的初学者第一次看到都得愣一下。哪怕是在代码里写过几百次%x格式化输出的人真被问到156 的二进制是多少时也未必能立刻反应上来。我见过太多人把进制转换的方法背得滚瓜烂熟可一旦题目从十进制转二进制换成十六进制转八进制就直接卡壳。问题基本不在记忆力而在没抓住最核心的那个概念——位权。这东西想通了四种常用进制二进制、八进制、十进制、十六进制之间的所有转换都能一通百通。这篇我打算把进制转换完整拆一遍从原理到速算技巧从整数到小数从正向转换到反向验证全讲透。文章里给的每一步都有手算过程后面还会附上我在实际写代码时踩过的坑和验证技巧。适合正在学计算机基础的学生、刚入行的程序员以及任何想真正看穿数字本质的人。1. 先搞明白为什么需要进制这回事1.1 计算机为什么偏偏选二进制很多人把计算机用二进制当成一个需要死记的结论其实背后的原因非常朴素计算机的底层硬件是晶体管一个晶体管只有两种稳定的物理状态——通电和断电。用这两种状态来表示数字就是二进制。你想想如果非要用十进制让一个元件表示 0 到 9 十种状态硬件复杂度会呈指数级上升而且抗干扰能力大幅下降。电路里的电压稍微波动一下到底是 5 还是 6 就说不清了。但只有有电/没电两个状态判断就极其可靠。这是工程上的最优解不是数学上的唯一解。所以二进制不是应该用的数字系统而是不得不用的数字系统。你要跟计算机打交道就得学会用它的语言理解数字。1.2 八进制和十六进制二进制的压缩包二进制有个让人头疼的毛病——太长了。十进制的 1024 写成二进制是10000000000整整 11 位。人眼扫过去很容易数错写代码时更是灾难。于是人们想到了一个取巧的办法既然 8 2³16 2⁴那用 8 或 16 作底数就能用少量位数表达同样多的信息。八进制和十六进制本质上就是二进制的压缩表示它们和二进制之间有非常整齐的对应关系转换根本不需要经过十进制。这就是为什么你会在各种场合看到十六进制内存地址、MAC 地址、颜色代码#FF8800、Unicode 字符编码、IPv6 全是十六进制的天下。八进制如今用得少一些但 Unix/Linux 文件权限chmod 755至今还是八进制老系统里的0前缀数字也保留了八进制的传统。搞懂这些你读程序、看日志、查内存都会顺很多。2. 四种进制的底层规则位权是理解一切的关键2.1 逢n进一到底是什么意思我们常说的十进制是逢十进一二进制是逢二进一八进制是逢八进一十六进制是逢十六进一。这句话很多人口头会说但没细想它背后的含义。说白了就是每一位上的数字达到底数 n 时就要往左进一位这一位清零重新开始。十进制的 9 加 1 变成 10个位归 0、十位进 1二进制的 1 加 1 变成 10因为二进制的位只有 0 和 12 这个数字根本不存在所以只能用10来表示二。这里有个初学者最容易犯迷糊的点二进制的10读作一零不是十。它是二不是十。同理八进制的10是八十六进制的10是十六。同一个写法在不同进制里代表的数值完全不一样这就是为什么我们写数字时要格外注意进制标识。2.2 位权每个数字位置的身价理解了进位规则就能引出全篇最核心的概念——位权。一个数字写成一串比如十进制的 345它其实是345 3×10² 4×10¹ 5×10⁰ 3×100 4×10 5×1 300 40 5这里的10²、10¹、10⁰就是每一位的身价专业术语叫位权。位权由底数进制和位置决定位置从右往左数从 0 开始。小数点左边的第一位是 0 次方第二位是 1 次方小数点右边则是负次方。把这套规则推广到任意进制就得到了一条万能公式任意进制数d_n d_{n-1} ... d_1 d_0 . d_{-1} d_{-2} ...底数为 b转十进制的值 d_n×bⁿ d_{n-1}×bⁿ⁻¹ ... d₁×b¹ d₀×b⁰ d₋₁×b⁻¹ d₋₂×b⁻² ...这条公式就是整篇内容的脊椎。后面所有转十进制的操作本质上都是在套它而十进制转其他进制可以理解成它的逆运算。2.3 两张必须印在脑子里的表学进制转换有两张表建议你直接背下来它们能省掉大量重复计算的时间。第一张是 2 的幂次表因为二进制转十进制要反复用到2的幂次数值2的幂次数值2⁰12⁷1282¹22⁸2562²42⁹5122³82¹⁰10242⁴162¹¹20482⁵322¹²40962⁶642¹³8192第二张是十进制 0 到 15 在四种进制里的对照表这张表是二进制与八进制、十六进制互转的基础十进制二进制八进制十六进制000011112102231133410044510155611066711177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F注意观察一个规律二进制和十六进制在 8 之后就分道扬镳了但八进制和十六进制的数字符号却一直对应到 7。这说明什么说明 8 恰好是二进制三位一组的容量上限16 恰好是四位一组的容量上限。这个规律到第 5 节会发挥大作用。3. 任意进制转十进制一套公式通吃3.1 二进制转十进制的对号入座法先拿二进制开刀。二进制转十进制就是把每一位上的数字和它对应的位权相乘再全部加起来。举例1011.01₂转十进制。先把每一位标记清楚1 0 1 1 . 0 1 2³ 2² 2¹ 2⁰ 2⁻¹ 2⁻²然后按位权展开1011.01₂ 1×2³ 0×2² 1×2¹ 1×2⁰ 0×2⁻¹ 1×2⁻² 8 0 2 1 0 0.25 11.25得到结果11.25。整个过程像是对号入座看到某一位是 1就把这个位置的权加上是 0 就跳过。所以也有人说二进制转十进制是数数游戏——把位权表里为 1 的位置对应的值全加起来就行。我刚学的时候有位老师教了个土办法把 2 的幂次方从右往左写在每一位头顶上128 64 32 16 8 4 2 1然后只看数字是 1 的位置直接相加。这个方法在位数少于 8 位时尤其好用各位可以试一下。3.2 十六进制和八进制转十进制一模一样有人觉得十六进制转十进制难其实一点不难还是套同一条公式只是把底数从 2 换成 16。举例3E.8₁₆转十进制。先记住字母和数字的对应A10, B11, C12, D13, E14, F15。所以3E.8实际上是3, 14, 8三个数字。3E.8₁₆ 3×16¹ 14×16⁰ 8×16⁻¹ 3×16 14×1 8×0.0625 48 14 0.5 62.5注意16⁻¹等于1/16 0.0625不是 0.6这是新手特别容易算错的地方。八进制同理把底数换成 817.4₈ 1×8¹ 7×8⁰ 4×8⁻¹ 8 7 0.5 15.5到这儿你应该看出来了其他进制转十进制没有任何技巧就是一条公式走天下。如果你只会背二进制怎么转十六进制怎么转这种零散结论而不是记住位权展开这个方法本身那每次遇到新情况都会很被动。3.3 小数部分位权的规律越往右越小关于小数部分我补充一个速记规律。二进制小数点后的位权依次是0.5、0.25、0.125、0.0625...也就是每次对半分2⁻¹ 0.52⁻² 0.252⁻³ 0.1252⁻⁴ 0.0625。十六进制小数点后的位权则是1/16、1/256、1/4096...八进制是1/8、1/64、1/512...。记住对半分这个规律你就不需要每次临时去算2⁻³到底是多少。我在带新人时经常问一个问题二进制0.001等于十进制多少凭规律答不上来的人基本都是没把位权表记牢全是现算的。4. 十进制转其他进制除基取余和乘基取整这一节是反过来的操作也是很多人最容易写错步骤的地方。整体思路分两部分整数部分和小数部分方法完全不同必须分开处理。4.1 整数部分除基取余余数必须倒着读十进制整数转二进制的方法叫除基取余法。核心操作用 2 反复去除这个数每次记下余数一直除到商为 0 为止最后把余数从下往上倒着排。拿45举例45 ÷ 2 22 余 1 22 ÷ 2 11 余 0 11 ÷ 2 5 余 1 5 ÷ 2 2 余 1 2 ÷ 2 1 余 0 1 ÷ 2 0 余 1把余数从下往上排101101。所以45 101101₂。验证一下101101₂ 32 8 4 1 45正确的。把底数换成 8 或 16方法一字不改。转十六进制时注意余数如果是 10 到 15要写成A到F156 ÷ 16 9 余 12 → C 9 ÷ 16 0 余 9余数倒着排9C。所以156 9C₁₆验证9×16 12 156正确。这里最容易犯的错误是正着读余数。我第一次教这东西时就见过不下十个人把45写成101101的反序101101还看不出来因为正着读110101恰好也是 53跟 45 差得不算离谱特别容易蒙混过去。所以每次算完强烈建议做一次反向验证第 6 节会细说。4.2 小数部分乘基取整整数从上往下排小数部分的方法叫乘基取整法用 2 反复去乘小数部分每次取乘积的整数位一直乘到小数部分变成 0 为止整数位从上往下排。拿0.6875举例转二进制0.6875 × 2 1.375 取整数 1 0.375 × 2 0.75 取整数 0 0.75 × 2 1.5 取整数 1 0.5 × 2 1.0 取整数 1第一次乘完小数部分变成 0.375继续用剩下的 0.375 乘而不是用 1.375 乘——很多新手这一步就搞混了。最终整数位从上往下排0.1011。所以0.6875 0.1011₂。验证0.1011₂ 0.5 0.125 0.0625 0.6875正确。注意小数部分的余数顺序和整数部分完全相反整数部分是倒着读小数部分是正着读。这个对比特别容易记混我的记忆口诀是整倒小正——整数倒序小数正序。你可以把这个口诀抄在笔记本上。4.3 为什么0.1在计算机里永远算不干净有个问题必须在这里讲透因为它直接关系到你对浮点数的理解十进制小数转二进制时未必能除尽。比如0.10.1 × 2 0.2 取 0 0.2 × 2 0.4 取 0 0.4 × 2 0.8 取 0 0.8 × 2 1.6 取 1 0.6 × 2 1.2 取 1 0.2 × 2 0.4 取 0 ← 循环开始了 0.4 × 2 0.8 取 0 ...发现没有0.2 → 0.4 → 0.8 → 1.6 → 1.2 → 0.4...后面陷入了无限循环。0.1在二进制里是一个无限循环小数就像1/3在十进制里是0.333...一样。这意味着什么意味着计算机里根本不存在精确的0.1只能用某种精度去近似存储。这就是你在 C 语言里写0.1 0.2得到的结果不是精确的0.3的根本原因。遇到这种情况乘基取整法就得人为设定停止条件要么小数部分归零能算尽的情况要么算到目标精度就停比如保留 8 位二进制小数。注意不是所有十进制小数都能精确转换成二进制小数。只有分母是 2 的幂次的十进制小数如0.5、0.25、0.6875才能算尽其余基本都是近似表达。4.4 整数加小数的完整演练156.6875转二进制把前面的方法串起来走一遍。156.6875转二进制流程如下先转整数部分156156 ÷ 2 78 余 0 78 ÷ 2 39 余 0 39 ÷ 2 19 余 1 19 ÷ 2 9 余 1 9 ÷ 2 4 余 1 4 ÷ 2 2 余 0 2 ÷ 2 1 余 0 1 ÷ 2 0 余 1余数倒排10011100。再转小数部分0.6875上面算过0.1011。两部分拼一起小数点放在中间10011100.1011₂。最后反向验证10011100.1011₂ 128 16 8 4 0.5 0.125 0.0625 156.6875对账成功。这套正向转换 反向回验的流程就是我做所有进制题的标配动作。5. 二进制与八进制、十六进制互转真正的速算技巧5.1 分组法的原理82³162⁴如果每道题都走先转十进制再转目标进制的路子速度慢不说中间还容易出错。好在这三种进制之间有天然的捷径。因为8 2³所以二进制的每 3 位恰好对应八进制的1 位因为16 2⁴所以二进制的每 4 位恰好对应十六进制的1 位。这个恰好不是巧合而是底数的幂次关系。翻回第 2 节那张 0 到 15 的对照表你会发现三位二进制能表示的 0~7 正好是八进制的一个数字四位二进制能表示的 0~15 正好是十六进制的一个数字。这就是为什么我说八进制和十六进制是二进制的压缩格式——它们之间的转换根本不需要经过十进制这个翻译。5.2 二进制转八进制/十六进制三步走以1101011.01₂转八进制为例完整流程**第一步以小数点为基准向左右两边分组。**转八进制就每 3 位一组转十六进制就每 4 位一组。这个从小数点往两边的方向非常重要方向错了整道题就全错了。**第二步位数不够就补零。**最左边和最右边的组如果不足 3 位或 4 位分别向两边补 0。注意整数部分在最左边补 0不影响大小小数部分在最右边补 0也不影响大小。但中间不能随便补。第三步每组直接映射成对应进制的数字。转八进制的完整演示1101011.01₂ 分组 1 | 101 | 011 . 01 补零 001 | 101 | 011 . 010 映射 1 5 3 . 2 结果 153.2₈转十六进制的完整演示1101011.01₂ 分组 110 | 1011 . 01 补零 0110 | 1011 . 0100 映射 6 B . 4 结果 6B.4₁₆验证一下153.2₈ 1×64 5×8 3 2×0.125 64 40 3 0.25 107.256B.4₁₆ 6×16 11 4×0.0625 96 11 0.25 107.25。两者相等说明转换正确。5.3 反向操作八进制/十六进制直接拆二进制反过来更简单把八进制或十六进制每一位数字拆成对应的 3 位或 4 位二进制然后拼起来。5F.8₁₆转二进制5 F . 8 0101 1111 . 1000拼接01011111.1000₂去掉开头和末尾多余的 01011111.1₂。再转八进制验证中间不用十进制1011111.1₂ 分组 1 | 011 | 111 . 1 补零 001 | 011 | 111 . 100 映射 1 3 7 . 4 结果 137.4₈5F.8₁₆和137.4₈到底等不等转成十进制验证5F.8 80150.5 95.5137.4₈ 642470.5 95.5相等。这个二进制中转站的路子非常稳。5.4 绕开十进制的八进制与十六进制互转有了上面这个方法你就能实现一种特别高效的技巧八进制和十六进制互转时完全不用经过十进制。先把原数转成二进制再把二进制按目标进制的位数重新分组。57.4₈转十六进制第一步八进制拆二进制 5 7 . 4 101 111 . 100 → 101111.100₂ 第二步二进制按4位重分组不足补0 0010 | 1111 . 1000 2 F . 8 结果2F.8₁₆整个过程只要两张映射表不用做任何乘法和除法。平时你要是经常在内存地址或网络报文里切换查看格式这个技巧能帮你省下大量心算时间。6. 高频错误、验证方法以及工程里的实战细节6.1 六个高频错误每一个都是真实踩坑记录这些年我改作业、带新人见过的典型错误汇总成一张表错误类型错误示范正确做法整数除基取余后正着读45 → 110101错余数从下往上101101十六进制数字 10~15 写两位数字用 10 表示十进制的 10用 A~F 表示一位占一格二进制分组方向搞反从小数点从右往左分组后小数部分也按左到右读整数部分从小数点往左小数部分从小数点往右两边方向不同小数乘基取整时用错乘数0.6875×21.375后再用1.375×2每次只用上一步剩下的纯小数部分乘 2补零补错位置二进制101101.1转十六进制时补成0001 0110 1.1整数补左边小数补右边0010 1101 . 1000以为十进制小数都能精确转二进制算出0.1循环却硬凑成有限位认清无限循环按精度截断并接受误差第二个错误我多说一句十六进制里A是一个数字不是一个数字加一个字母的组合。你在草稿纸上写3E时E就是单独的一位。把它当成数字14而不是字母E来理解后面展开计算时才不会乱。6.2 反向验证把对账变成习惯说句实在话任何人手算都可能出错包括我自己。所以我给自己立了个规矩每次转换完必须做反向验证。反向验证最自然的方式就是原路返回——你从十进制转成了二进制那就把二进制再按位权展开转回十进制两边的数对得上这题才算做完。还有一个更快的粗校验方法估算数量级。比如你把一个几百的数转成二进制结果却写出了 8 位数那大概率没错可要是写成了 4 位数肯定不对因为1111₂ 15离几百差远了。这种数量级上的直觉练多了能帮你快速筛掉低级错误。验证工具方面Windows 自带的计算器有程序员模式Alt3 切换支持十进制、十六进制、八进制、二进制四者互转做大量转换时比我手算快得多。但工具只是验证用的原理你还是得会否则工具给出的结果对不对你都判断不了。6.3 工程里的进制C语言格式化与常见魔数既然热搜里带着进制转换c语言这块就多说几句。C 语言的标准库提供了printf的格式化输出直接支持三种进制的打印#include stdio.h int main(void) { int n 156; printf(十进制: %d\n, n); printf(八进制: %o\n, n); printf(十六进制: 0x%X\n, n); return 0; }输出结果十进制: 156 八进制: 234 十六进制: 0x9C%o是八进制%x/%X是十六进制小写/大写字母。二进制在标准 C 里没有直接的格式化符不过从 C23 开始新增了%b支持GCC 等编译器也提供扩展。如果你还在用老标准想打印二进制就得自己写个移位循环这里给个简单版本void print_binary(unsigned int n) { for (int i 31; i 0; i--) { putchar((n i) 1 ? 1 : 0); } putchar(\n); }顺带说几个工程里非常常见的十六进制魔数记住了会很有用0xFF 2550xFFFF 655350x7FFFFFFF是 32 位有符号整数最大值0x80000000是负数的最小值对应的位模式。读代码时看到这些数能直接反应出十进制大小调试效率会高很多。6.4 记住这些锚点值心算快人一步最后分享一个我自己的习惯把几个关键值当成锚点记住心算时拿它做参照。比如2¹⁰ 1024这个值在存储容量里天天见1KB 1024B它对应的十六进制是0x400。再往上推2¹⁶ 65536 0x100002²⁰ 1048576 0x100000恰好是 1MB。有了这些锚点你看到地址0xFFF能立刻想到 4095看到子网掩码255.255.255.0能立刻想到二进制是连续 24 个 1——这些都是网络排查中的高频场景。另外八进制在权限位上的应用也值得顺便记一下chmod 755拆开看每一位八进制对应三格二进制权限位7 111 rwx5 101 r-x。所以755就是所有者可读写执行组和其他人可读可执行。把进制搞懂了这种日常命令背后的原理就全通了。在我自己的实践里进制转换这个东西最大的价值不是应付考试而是建立一种看穿数字的能力。遇到一个十六进制颜色、一段内存地址、一个权限码你能快速在脑海中和十进制、二进制之间来回切换那写代码、查问题都会有一种明显的掌控感。方法本身不复杂建议你拿几个随机数按这篇文章的流程完整演算一遍直到整倒小正和分组补零这两个要点成为肌肉记忆为止。踩过几次坑之后你就会发现这真的是计算机基础里最值得花两个小时彻底搞懂的内容之一。
返回列表