数据的表示--进位计数制与转换

进制转换

进制是计算机组成原理的入门核心知识点。计算机底层所有数据都以二进制形式存储、运算,日常计算我们习惯使用十进制,而在编程、硬件描述、网络地址等场景中,八进制与十六进制也十分常见。很多人觉得进制转换零散难记,其实只要理清核心规则、选对对应方法,就能高效完成各类转换。本文从基础概念到进阶速算技巧,完整梳理常用进制转换的全部方法。

一、四种常用进制的基础概念

进制的核心规则是「逢基数进一」,不同进制的可用数码、进位规则、表示方式各有区别。

1. 核心参数对比

进制类型 可用数码 基数 r 进位规则 下标表示法 后缀表示法 C 语言前缀写法
十进制 0,1,2,3,4,5,6,7,8,9 10 逢十进一 (数)₁₀ 数 D 无前缀,直接书写数字
二进制 0,1 2 逢二进一 (数)₂ 数 B 0b 开头,如 0b101011
八进制 0,1,2,3,4,5,6,7 8 逢八进一 (数)₈ 数 O 0 开头,如 0101011
十六进制 0-9、A/B/C/D/E/F 16 逢十六进一 (数)₁₆ 数 H 0x 开头,如 0x101011

2. 补充说明

十六进制中,用 A~F 依次对应十进制的 10~15,书写时大小写不影响含义;C 语言中需特别注意前缀区分,避免将八进制误判为十进制。

二、进制转换核心方法

1. 任意进制 → 十进制:按权展开法

这是所有进制转十进制的通用方法,核心是利用「位权」计算最终数值。

  1. 核心原理:将每一位的数码乘以对应位的权值(基数的 n 次方),所有结果相加,即可得到十进制数。
  2. 权值规则:整数部分从右往左,权值从基数的 0 次方开始递增;小数部分从左往右,权值从基数的 - 1 次方开始递减。
  3. 示例:二进制 (101.1)₂转十进制 整数部分:1×2² + 0×2¹ + 1×2⁰ = 4 + 0 + 1 = 5 小数部分:1×2⁻¹ = 0.5 最终结果:(101.1)₂ = (5.5)₁₀

2. 十进制 → 任意进制:除基取余 + 乘基取整

十进制转其他进制时,整数部分与小数部分需分开处理,二者操作规则完全不同。

2.1 整数部分:除基取余法,低位先得
  1. 操作步骤
    1. 用十进制整数除以目标进制的基数,记录余数
    2. 用上一步得到的商继续除以基数,再次记录余数
    3. 重复操作直到商为 0
    4. 将所有余数从下往上排列(先得到的是最低位,后得到的是最高位),即为转换结果
  2. 示例:十进制 123 分别转二、八、十六进制
    • 转二进制:反复除以 2,余数依次为 1、1、0、1、1、1、1,倒序得 1111011
    • 转八进制:反复除以 8,余数依次为 3、7、1,倒序得 173
    • 转十六进制:反复除以 16,余数依次为 11 (对应 B)、7,倒序得 7B
2.2 小数部分:乘基取整法,高位先得
  1. 操作步骤
    1. 用十进制小数乘以目标进制的基数,记录结果的整数部分
    2. 用上一步结果的小数部分继续乘以基数,再次记录整数部分
    3. 重复操作直到小数部分为 0,或达到所需精度位数
    4. 将所有整数部分从上往下排列(先得到的是最高位),即为小数部分结果
  2. 示例:十进制 0.6875 分别转二、八、十六进制
    • 转二进制:反复乘 2,整数部分依次为 1、0、1、1,得 0.1011
    • 转八进制:反复乘 8,整数部分依次为 5、4,得 0.54
    • 转十六进制:乘 16 得整数 11 (对应 B),得 0.B
  3. 注意事项:并非所有十进制小数都能精确转换为其他进制,可能出现无限循环,此时按需求保留对应精度即可。

3. 二进制 ↔ 八进制 / 十六进制:分组映射法

因为 8=2³、16=2⁴,因此 1 位八进制对应 3 位二进制,1 位十六进制对应 4 位二进制。这类转换无需经过十进制中转,直接分组映射即可,效率更高。

3.1 二进制 → 八进制 / 十六进制
  1. 分组规则
    • 整数部分:从右往左分组,位数不足时在左侧补 0
    • 小数部分:从左往右分组,位数不足时在右侧补 0
    • 每组分别换算为对应进制的一位数,按顺序拼接即为结果
  2. 示例:二进制 (1011001100.11011)₂转换
    • 转八进制(3 位一组):分组为 001 011 001 100 . 110 110,对应结果 1314.66
    • 转十六进制(4 位一组):分组为 0010 1100 1100 . 1101 1000,对应结果 2CC.D8
3.2 八进制 / 十六进制 → 二进制

反向操作即可:每 1 位八进制展开为 3 位二进制,每 1 位十六进制展开为 4 位二进制,整数前导 0、小数末尾 0 可按需省略。

  • 示例:八进制 34 → 011 100 → 二进制 11100
  • 示例:十六进制 2A → 0010 1010 → 二进制 101010

4. 十进制转二进制进阶:凑值法(重点)

对于 8 位、16 位以内的小整数,凑值法是比除基取余更快的口算方法,在 IP 地址换算、选择题验算等场景中非常实用。

4.1 核心原理

凑值法是按权展开的反向操作:二进制每一位对应一个 2 的幂次,将目标十进制数拆分为若干个 2 的幂次之和,用到的幂次对应位写 1,未用到的写 0,即可得到二进制结果。

生活化类比:就像用固定面额(1、2、4、8、16...)的钞票凑钱,从最大面额开始尝试,够就拿一张(对应位写 1),不够就跳过(对应位写 0),最终拿出的钞票序列就是对应的二进制数。

4.2 常用 2 的幂次表(建议熟记)
幂次 2⁰ 2⁴ 2⁵ 2⁶ 2⁷ 2⁸
十进制数值 1 2 4 8 16 32 64 128 256

其中 2⁷到 2⁰对应 1 字节(8 位)的位权,是最常用的一组数值。

4.3 操作步骤
  1. 定高位:找到不大于目标数的最大 2 的幂,确定二进制最高位位置。
  2. 逐位判:从最高位到最低位依次比对,剩余数值≥当前位权则写 1 并减去权值,否则写 0。
  3. 得结果:判断到最低位后,拼接所有 0、1 序列,即为最终二进制数。
4.4 实战示例

示例 1:十进制 166 转二进制(IPv4 地址常用值)

  1. 最高位:不大于 166 的最大 2 的幂是 128(2⁷)
  2. 逐位计算: 128:166≥128 → 1,余 38 64:38<64 → 0 32:38≥32 → 1,余 6 16:6<16 → 0 8:6<8 → 0 4:6≥4 → 1,余 2 2:2≥2 → 1,余 0 1:0<1 → 0
  3. 结果:10100110
  4. 其实就是128+32+4+2

示例 2:十进制 23 转二进制(快速口算) 最高位为 16,依次判断得结果 10111。

三、转换总览

1. 转换路径总览

  1. 任意进制转十进制:统一使用按权展开法
  2. 十进制转任意进制:整数除基取余、小数乘基取整
  3. 二进制与八 / 十六进制互转:3 位 / 4 位分组映射法
  4. 八进制与十六进制互转:推荐以二进制为中转,操作最简便

2. 易错点

  1. 整数除基取余后,余数要从下往上读(低位先得);小数乘基取整后,整数要从上往下读(高位先得),二者顺序不可混淆。
  2. 分组转换时,整数部分左补 0,小数部分右补 0,补位方向不能出错。
  3. 十进制小数转二进制可能存在精度丢失,属于正常现象,按需保留位数即可。
相关推荐
鱼7333 天前
计算机的性能指标(2)--运算速度指标
计算机组成原理
Justice Young3 天前
计算机组成原理【期末冲刺版】
计算机组成原理
八解毒剂6 天前
编码和校验码
计算机组成原理
八解毒剂8 天前
计算机层次结构
计算机组成原理
LiamTuc17 天前
计组ROM 家族分类笔记
计算机组成原理
裁冰剪雪18 天前
软硬件联通的“最后一公里”:从C代码到CPU取指的完整交接链
计算机组成原理
MarkXu18 天前
localhost 背后:一趟没有出门的网络旅行
计算机组成原理
-To be number.wan1 个月前
计算机组组成原理 | AT&T格式 和 Intel格式
学习·计算机组成原理
轻刀快马1 个月前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理