资讯动态

计算机的“读心术“:一篇文章搞定二、八、十、十六进制的相互转换

发布时间:2026/9/25 19:42:10 来源:尧图企业网站定制
一句话概括计算机只认识 0 和 1但人类需要十进制程序员偏爱十六进制操作系统权限爱用八进制——进制转换本质上是同一个数字换了几种方言。看完这篇文章你会发现换算规则简单到令人发指。一、为什么程序员绕不开进制转换先看几个你一定遇到过的场景前端调试时颜色代码#FF5733里的每一位到底是什么意思Linux 下chmod 755的755是怎么算出来的网络编程里子网掩码255.255.255.0和/24是什么关系内存地址0x7FFE1234ABCD里的0x是什么意思后面那串又该怎么读如果你说不清这些问题说明进制转换这一关还没真正打通。别担心这篇文章会用最直观的方式把二、八、十、十六进制之间的转换彻底讲透。二、先搞懂进制到底是什么2.1 一句话定义进制就是逢几进一的计数规则。进制英文逢几进一可用数字常见前缀/后缀二进制Binary逢 2 进 10、10b如0b1010八进制Octal逢 8 进 10~70如012或0o十进制Decimal逢 10 进 10~9无日常使用十六进制Hexadecimal逢 16 进 109、AF0x如0x1A2.2 核心公式位权展开任何进制的数字本质都是每一位的数字 × 该位的权重之和。以十进制1234为例我们从小就在用位权展开只是没意识到1234 1×10³ 2×10² 3×10¹ 4×10⁰ 1000 200 30 4这个规律对所有进制通用只是把10换成对应的进制基数Base任意 N 进制数字的值 Σ (每一位数字 × N的位权次方)记住这一个公式你就掌握了所有转十进制的钥匙。三、任意进制 → 十进制位权展开法3.1 二进制 → 十进制以二进制1101为例从右往左位权依次是 2⁰、2¹、2²、2³ 1 1 0 1 ↓ ↓ ↓ ↓ 2³8 2²4 2¹2 2⁰1 1101(2) 1×8 1×4 0×2 1×1 13(10)3.2 八进制 → 十进制以八进制752为例752(8) 7×8² 5×8¹ 2×8⁰ 7×64 5×8 2×1 448 40 2 490(10)3.3 十六进制 → 十进制十六进制里A~F分别代表10~15这是唯一需要额外记忆的点。以1A3为例1A3(16) 1×16² 10×16¹ 3×16⁰ 256 160 3 419(10)十六进制字符ABCDEF十进制值101112131415小结无论几进制转十进制套路都一样——从右往左编号 0、1、2……每一位乘以基数的该次方再全部相加。四、十进制 → 任意进制除基取余法这是很多人容易搞混方向的地方记住口诀除以谁就是转成谁的进制余数从下往上读就是答案。4.1 十进制 → 二进制以 89 为例89 ÷ 2 44 ...... 余 1 ↑ 44 ÷ 2 22 ...... 余 0 ↑ 22 ÷ 2 11 ...... 余 0 ↑ 11 ÷ 2 5 ...... 余 1 ↑ 5 ÷ 2 2 ...... 余 1 ↑ 2 ÷ 2 1 ...... 余 0 ↑ 1 ÷ 2 0 ...... 余 1 最后一步商为 0 时停止 从下往上读余数1011001 89(10) 1011001(2)验算一下用第三节的位权展开法反推1011001 641681 89✅ 完全正确。4.2 十进制 → 八进制以 490 为例490 ÷ 8 61 ...... 余 2 ↑ 61 ÷ 8 7 ...... 余 5 ↑ 7 ÷ 8 0 ...... 余 7 ↑ 从下往上读752 490(10) 752(8)4.3 十进制 → 十六进制以 419 为例419 ÷ 16 26 ...... 余 3 ↑ 26 ÷ 16 1 ...... 余 10 → A ↑ 1 ÷ 16 0 ...... 余 1 ↑ 从下往上读1A3 419(10) 1A3(16)口诀总结除基取余余数逆序不够拿字母十六进制专属。五、划重点二、八、十六进制之间的闪电转换法如果每次都要绕道十进制效率太低。而二、八、十六进制之间其实有一条几乎不用计算的捷径——因为它们的基数都是 2 的幂次2¹ 2 二进制 2³ 8 八进制 2⁴ 16 十六进制核心原理3 位二进制 ⇔ 1 位八进制4 位二进制 ⇔ 1 位十六进制。5.1 二进制 ↔ 八进制三位一组二进制转八进制从右往左每 3 位分一组不足补 0再分别转十进制。以1011001为例从右往左每 3 位分组不足在左边补0 001 011 001 ↓ ↓ ↓ 1 3 1 1011001(2) 131(8)八进制转二进制反过来每一位八进制数字展开成 3 位二进制。以752为例7 → 111 5 → 101 2 → 010 拼接111 101 010 752(8) 111101010(2)5.2 二进制 ↔ 十六进制四位一组二进制转十六进制从右往左每 4 位分一组不足补 0。以1011001为例从右往左每 4 位分组 0101 1001 ↓ ↓ 5 9 1011001(2) 59(16)十六进制转二进制每一位十六进制数字展开成 4 位二进制。以1A3为例1 → 0001 A → 1010 3 → 0011 拼接0001 1010 0011 1A3(16) 000110100011(2) → 去掉前导0 → 110100011(2)5.3 对照速查表强烈建议背下来十进制二进制八进制十六进制00000001000111200102230011334010044501015560110667011177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F把这张表刻进脑子里你看一眼十六进制数字就能秒转二进制——这正是十六进制在计算机里大行其道的原因它是二进制的压缩包4 位变 1 位还不丢信息。六、实战演示写一个万能进制转换器光讲手算不过瘾我们用代码把整套逻辑跑一遍——分别演示任意进制转十进制和十进制转任意进制两个方向并验证第五节的闪电转换法。6.1 C# 实现.NET 内置方法 手写原理两个版本usingSystem;classNumberSystemConverter{staticvoidMain(){Console.WriteLine( 方式一调用 .NET 内置方法 \n);BuiltInDemo();Console.WriteLine(\n 方式二手写位权展开 / 除基取余 \n);ManualDemo();}// ---------- 方式一内置方法工程中直接用这个 ----------staticvoidBuiltInDemo(){intnumber89;// 十进制 - 其他进制Convert.ToString(数字, 基数)Console.WriteLine(${number}的二进制 {Convert.ToString(number,2)});Console.WriteLine(${number}的八进制 {Convert.ToString(number,8)});Console.WriteLine(${number}的十六进制 {Convert.ToString(number,16).ToUpper()});// 其他进制 - 十进制Convert.ToInt32(字符串, 基数)stringbinStr1011001;stringhexStr1A3;Console.WriteLine($\n二进制{binStr}转十进制 {Convert.ToInt32(binStr,2)});Console.WriteLine($十六进制{hexStr}转十进制 {Convert.ToInt32(hexStr,16)});// 十六进制格式化输出的另一种写法Console.WriteLine($\n{number:X}(大写) /{number:x}(小写));// 格式化字符串}// ---------- 方式二不依赖内置方法手写还原算法原理 ----------staticvoidManualDemo(){intdecimalNum419;Console.WriteLine($手写实现{decimalNum}(10) 转二进制、八进制、十六进制\n);Console.WriteLine($二进制 {ToBaseString(decimalNum,2)});Console.WriteLine($八进制 {ToBaseString(decimalNum,8)});Console.WriteLine($十六进制 {ToBaseString(decimalNum,16)});Console.WriteLine();stringhex1A3;Console.WriteLine($手写实现十六进制{hex}转十进制 {FromBaseString(hex,16)});}/// summary/// 除基取余法十进制 - 任意进制原理演示非内置方法/// /summarystaticstringToBaseString(intnumber,inttargetBase){if(number0)return0;conststringdigits0123456789ABCDEF;stringresult;while(number0){intremaindernumber%targetBase;// 取余resultdigits[remainder]result;// 余数逆序拼接number/targetBase;// 继续除}returnresult;}/// summary/// 位权展开法任意进制字符串 - 十进制原理演示非内置方法/// /summarystaticintFromBaseString(stringnumber,intfromBase){conststringdigits0123456789ABCDEF;intresult0;foreach(charcinnumber){intdigitValuedigits.IndexOf(char.ToUpper(c));resultresult*fromBasedigitValue;// 秦九韶算法等价于位权展开}returnresult;}}6.2 运行结果 方式一调用 .NET 内置方法 89 的二进制 1011001 89 的八进制 131 89 的十六进制 59 二进制 1011001 转十进制 89 十六进制 1A3 转十进制 419 59 (大写) / 59 (小写) 方式二手写位权展开 / 除基取余 手写实现419(10) 转二进制、八进制、十六进制 二进制 110100011 八进制 643 十六进制 1A3 手写实现十六进制 1A3 转十进制 4196.3 代码里藏了一个高手技巧秦九韶算法FromBaseString方法里的这一行resultresult*fromBasedigitValue;这其实是位权展开公式的另一种写法比如四位数d3 d2 d1 d0标准展开d3×N³ d2×N² d1×N¹ d0×N⁰ 秦九韶算法霍纳法则((d3×N d2)×N d1)×N d0两者结果完全相同但秦九韶算法只需要循环里做乘加不需要单独计算幂次代码更简洁性能也更优——这是位权展开公式在工程中最常见的实现方式建议直接记住这个写法。七、进制转换在真实开发中的 4 个高频场景场景 1颜色代码十六进制#FF5733 └┬┘└┬┘└┬┘ R G B FF 255红色分量拉满 57 87 33 51十六进制正好两位表示 0~255这就是颜色码普遍用十六进制而不是十进制的原因——更紧凑且和字节8 bit 2 位十六进制完美对齐。场景 2Linux 文件权限八进制chmod 755 file.txt 7 111 → rwx所有者读写执行 5 101 → r-x同组读执行 5 101 → r-x其他读执行每一位八进制数字恰好对应 3 个权限位读/写/执行这正是权限管理偏爱八进制的原因。场景 3网络子网掩码255.255.255.0 11111111.11111111.11111111.00000000 前 24 位是 1 → 也就是常说的 /24把点分十进制换算成二进制才能真正看懂子网划分的逻辑。场景 4内存地址与调试0x7FFE1234ABCD内存地址普遍用十六进制展示是因为它能用最短的字符串精确表示一长串二进制地址——4 位二进制压缩成 1 位十六进制可读性直接起飞。八、常见误区与避坑指南坑 1分组方向搞反二进制转八进制/十六进制分组必须从右往左数不够位数在左边补 0而不是从左往右分错误示范10110 从左往右分 3 位 → 101 10(补0)10 → 5, 2 ❌ 正确做法10110 从右往左分 3 位 → 10 110 → 补0成 010 110 → 2, 6 → 26(8)坑 2小数部分的进制转换方向也容易搞反整数部分是除基取余从下往上读小数部分则是乘基取整从上往下读两者方向刚好相反0.625(10) 转二进制 0.625 × 2 1.25 → 取整 1 ↓ 0.25 × 2 0.5 → 取整 0 ↓ 0.5 × 2 1.0 → 取整 1 ↓ (小数部分为0停止) 从上往下读0.101 0.625(10) 0.101(2)坑 3八进制的0 前缀陷阱在很多语言包括早期 C 风格语言中010会被当成八进制的 8而不是十进制的 10C# 中虽然去掉了这个坑普通字面量不支持0前缀八进制但读别人代码、写配置文件如 Unix umask时一定要留心。坑 4十六进制字母大小写不影响数值1A3和1a3是完全相同的值但代码规范里通常建议大写字母表示十六进制数字与十进制数字形成更清晰的视觉区分。九、一张图总结全部转换路径位权展开法 ┌─────────────────────────┐ │ ▼ 二进制 ──三位一组──▶ 八进制 十进制 │ ▲ └─四位一组──▶ 十六进制 ────┘ 除基取余法反向箭头记住三句口诀走遍天下都不怕转十进制 → 位权展开逢位相乘再相加十进制转任意进制 → 除基取余余数逆序往上排二进制与八/十六进制互转 → 三位一组变八进制四位一组变十六进制十、写在最后进制转换看似是数学题实际上是理解计算机底层逻辑的一把钥匙。当你能秒懂0x1A3、chmod 755、#FF5733背后的数字含义时你看代码、读文档、排查 bug 的速度都会有质的飞跃。下次再看到一串陌生的十六进制或八进制数字别慌——套上今天学的三句口诀几秒钟就能心算出答案。 课后练习手算十进制1000分别转换成二进制、八进制、十六进制并用位权展开法验算。手算二进制11010110直接转换成十六进制提示四位一组不要绕道十进制。编程实现在第六节代码的基础上增加对带小数的十进制数转二进制的支持提示整数部分和小数部分要分开处理方向相反。觉得有收获欢迎点赞收藏下次调试内存地址或配置文件权限时不用再掐指心算秒懂即可下笔

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑