常用数制

解密计算机的“数字语言”:常用数制大起底!

哈喽! 👋 有没有觉得 “数字” 就像我们生活中的 “空气” 一样,无处不在,又不可或缺? 我们用数字来记录年龄、计算价格、衡量距离… 没有数字,现代社会简直无法想象!

但是,你有没有想过,我们人类常用的 “数字系统”,跟计算机内部使用的 “数字系统”,其实是不太一样的呢? 🤔 这就像我们人类有 “汉语”、“英语”、“法语” 等等不同的语言一样,计算机也有它自己独特的 “数字语言”。

今天,就让我来当一回 “语言老师”,带你学习几种计算机世界里最常用的 “数字语言” —— 数制。 掌握了这些 “数制”,就如同掌握了 打开计算机世界大门的钥匙,让你对计算机的理解更上一层楼! 🚀

🗣️ 什么是 “数制”? (给数字 “穿上不同的衣服”)

在我们深入各种具体的 “数制” 之前,先来简单理解一下 “数制” 到底是什么意思。 你可以把 “数制” 想象成 给数字 “穿上不同的衣服”

我们平时用的 “十进制”,就像是数字的 “日常休闲装”,简单、自然、方便我们日常使用。 但是,计算机的世界,更喜欢 “二进制” 这种 “工作制服”,简洁、高效、更适合计算机硬件的工作方式。

二进制

“数制” 的本质,就是一套 计数规则 它规定了:

  1. 用哪些 “数字符号” 来表示数值? 例如,十进制用 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 这十个符号。
  2. 如何进行进位? 例如,十进制是 “逢十进一”,二进制是 “逢二进一”。

不同的数制,就像不同的 “方言” 一样,虽然表达的是 同一个意思 (数值),但是 “表达方式” (数字符号和进位规则) 却不一样。 就像 “我爱你”,用汉语说,用英语说 “I love you”,用法语说 “Je t’aime”,虽然语言不同,但表达的爱意却是相同的。

接下来,我们就来逐一认识几种计算机中常用的 “数制方言” 吧!

🔢 “方言” 一: 十进制 (Decimal - D) — 我们最熟悉的 “母语”

十进制 (Decimal) ,是我们 人类最常用,也是最熟悉 的数制。 之所以选择十进制,很可能是因为我们 有十根手指 ,数数的时候掰手指最方便 (这纯属猜测啦 😉)。

十进制的特点:

  • 基数: 10 — 也就是说,十进制使用 10 个不同的数字符号0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • 进位规则: 逢十进一 — 当某一位的数值达到 10 时,就向高位进 1。

举个例子: 我们平时数数: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 接下来就是 10 (逢十进一,个位变 0,十位变 1), 然后是 11, 12, … 19, 接下来又是 20 (逢十进一,个位变 0,十位进 1), 以此类推。

在十进制中,每一个数字的位置都代表着不同的 “权值” (位权) 。 例如,对于十进制数 123

  • 个位 (右边第一位): 3 — 表示 3 * 10^0 = 3 * 1 = 3
  • 十位 (右边第二位): 2 — 表示 2 * 10^1 = 2 * 10 = 20
  • 百位 (右边第三位): 1 — 表示 1 * 10^2 = 1 * 100 = 100

所以,123 实际上就等于 100 + 20 + 3 = 123。 这里的 10^0, 10^1, 10^2 就是十进制的 位权 (权值)底数 (10) 就是十进制的 基数

虽然十进制我们非常熟悉,但是,计算机内部却 不直接使用十进制 ,而是使用另一种更简洁、更高效的数制 —— 二进制

💡 “方言” 二: 二进制 (Binary - B) — 计算机的 “母语” (重点!)

二进制 (Binary) ,是 计算机世界的 “通用语言” ,也是 计算机硬件最容易 “理解” 和 “实现” 的数制 。 之所以选择二进制,是因为计算机内部的电子元件 (例如晶体管), 天生就具有 “两种状态” 的特性

  • 导通 (通电) — 可以表示 “1” (真、True、高电平)
  • 截止 (断电) — 可以表示 “0” (假、False、低电平)

这就像 开关的 “开” 和 “关” 两种状态 , 或者 电灯的 “亮” 和 “灭” 两种状态 一样, 非常简单,而且 易于实现,稳定可靠

二进制的特点:

  • 基数: 2 — 也就是说,二进制只使用 2 个不同的数字符号0 和 1 。 所以,二进制数中, 只会出现 0 和 1 这两个数字
  • 进位规则: 逢二进一 — 当某一位的数值达到 2 时,就向高位进 1。

举个例子: 二进制数数: 0, 1, 接下来就是 10 (逢二进一,个位变 0,十位变 1), 然后是 11, 接下来又是 100 (逢二进一,个位和十位都变 0,百位进 1), 以此类推。

在二进制中,每一个数字的位置也代表着不同的 “权值” (位权) 。 例如,对于二进制数 1011

  • 第 0 位 (右边第一位): 1 — 表示 1 * 2^0 = 1 * 1 = 1
  • 第 1 位 (右边第二位): 1 — 表示 1 * 2^1 = 1 * 2 = 2
  • 第 2 位 (右边第三位): 0 — 表示 0 * 2^2 = 0 * 4 = 0
  • 第 3 位 (右边第四位): 1 — 表示 1 * 2^3 = 1 * 8 = 8

所以,二进制数 1011 转换为十进制数,就等于 8 + 0 + 2 + 1 = 11。 这里的 2^0, 2^1, 2^2, 2^3 就是二进制的 位权 (权值)底数 (2) 就是二进制的 基数

二进制虽然只有 0 和 1 两个数字,看起来很 “简陋”,但它却可以表示 世界上所有的数值和信息 。例如,数字、文字、图片、音频、视频,在计算机内部,最终都会被 转换成二进制代码 来存储和处理。

二进制是计算机的 “基石”,理解二进制,是理解计算机工作原理的关键一步!

🧑‍🤝‍🧑 “方言” 三 和 “方言” 四: 八进制 (Octal - O) 和 十六进制 (Hexadecimal - H) — 二进制的 “简写形式”

八进制 (Octal)十六进制 (Hexadecimal) , 这两种数制,在计算机中也经常用到。 但它们 并不是计算机 “直接使用” 的语言,而是 为了方便人类阅读和书写二进制数而 “发明” 的 “简写形式”

原因: 我们已经知道,二进制数虽然简洁,但是 对于人类来说,读写起来却非常 “冗长” 。 例如,十进制数 255, 用二进制表示就是 11111111, 要写 8 个 1,很容易看错数错。 如果数字再大一些,二进制表示就会更长,更难读写。

为了解决这个问题,人们就发明了 八进制和十六进制。 八进制和十六进制,可以看作是 二进制的 “压缩版” ,它们可以用 更少的位数 来表示 相同的数值 ,而且 与二进制之间的转换非常方便

3. 八进制 (Octal - O)

八进制的特点:

  • 基数: 8 — 使用 8 个数字符号0, 1, 2, 3, 4, 5, 6, 7
  • 进位规则: 逢八进一

八进制与二进制的 “速记” 关系: 每 3 位二进制数,可以对应 1 位八进制数。 因为 2^3 = 8。 这使得 二进制转八进制,以及八进制转二进制 变得非常简单快捷。

4. 十六进制 (Hexadecimal - H)

十六进制的特点:

  • 基数: 16 — 使用 16 个数字符号0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F。 其中, A, B, C, D, E, F 分别代表十进制的 10, 11, 12, 13, 14, 15
  • 进位规则: 逢十六进一

十六进制与二进制的 “速记” 关系: 每 4 位二进制数,可以对应 1 位十六进制数。 因为 2^4 = 16。 这使得 二进制转十六进制,以及十六进制转二进制 变得非常非常简单快捷。 十六进制是计算机领域最常用的二进制 “简写” 形式! 例如, 内存地址、颜色代码、HTML 网页代码 等等,都经常使用十六进制表示。

总结一下:

数制 基数 数字符号 进位规则 与二进制关系 主要用途
十进制 (D) 10 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 逢十进一 - 人类日常使用
二进制 (B) 2 0, 1 逢二进一 - 计算机内部表示和运算
八进制 (O) 8 0, 1, 2, 3, 4, 5, 6, 7 逢八进一 3 位二进制对应 1 位 简化二进制表示 (较少用)
十六进制 (H) 16 0-9, A, B, C, D, E, F 逢十六进一 4 位二进制对应 1 位 简化二进制表示 (常用),例如内存地址、颜色代码

🔄 数制之间的 “翻译”: 不同数制间的互相转换 (重点和难点!)

学会了各种数制,更重要的是要 掌握不同数制之间的互相转换 。 这就像学会了 “英语” 和 “汉语” 两种语言,还要学会 “英汉互译” 一样! 掌握数制转换,可以帮助我们 在不同的数字表示之间灵活切换,更好地理解计算机内部的数据表示方式

1. 二进制转十进制: “按权展开求和”

方法: 将二进制数的 每一位个位 (右边第一位) 开始依次乘以 2 的 0 次方1 次方2 次方 … 然后将 所有乘积相加 ,就得到了对应的十进制数。

公式: (bnbn1...b1b0)B=i=0nbi×2i(b_n b_{n-1} ... b_1 b_0)_B = \sum_{i=0}^{n} b_i \times 2^i

举例: 将二进制数 101101 转换为十进制数。

  1. 写出二进制数: 1 0 1 1 0 1
  2. 从右往左,标出每一位的 “权值” (2 的几次方):
    2^5 2^4 2^3 2^2 2^1 2^0
    1 0 1 1 0 1
  3. 将每一位的数值乘以对应的权值,然后求和:
    (1 * 2^5) + (0 * 2^4) + (1 * 2^3) + (1 * 2^2) + (0 * 2^1) + (1 * 2^0)
    = (1 * 32) + (0 * 16) + (1 * 8) + (1 * 4) + (0 * 2) + (1 * 1)
    = 32 + 0 + 8 + 4 + 0 + 1
    = 45

所以,二进制数 101101 转换为十进制数,就是 45

2. 十进制转二进制: “除 2 取余,逆序排列”

方法: 将十进制数不断除以 2,每次得到的 “余数” 记录下来,直到商为 0 为止。 然后将所有余数倒过来 (逆序排列),就得到了对应的二进制数。

举例: 将十进制数 45 转换为二进制数。

  1. 用 45 除以 2,商为 22,余数为 1: 45 ÷ 2 = 22 ... 1
  2. 用商 22 继续除以 2,商为 11,余数为 0: 22 ÷ 2 = 11 ... 0
  3. 用商 11 继续除以 2,商为 5,余数为 1: 11 ÷ 2 = 5 ... 1
  4. 用商 5 继续除以 2,商为 2,余数为 1: 5 ÷ 2 = 2 ... 1
  5. 用商 2 继续除以 2,商为 1,余数为 0: 2 ÷ 2 = 1 ... 0
  6. 用商 1 继续除以 2,商为 0,余数为 1: 1 ÷ 2 = 0 ... 1 (商为 0,结束)
  7. 将所有余数 逆序排列 (从下往上读): 1 0 1 1 0 1

所以,十进制数 45 转换为二进制数,就是 101101

3. 二进制转八进制: “三位一组,按组转换” (技巧!)

方法: 将二进制数 从右往左,每 3 位分成一组 (最左边不足 3 位,用 0 补齐), 然后将每一组 3 位二进制数,直接转换为对应的 1 位八进制数

对照表:

二进制 (3 位) 八进制 (1 位)
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

举例: 将二进制数 101101110 转换为八进制数。

  1. 将二进制数从右往左,每 3 位一组划分: 101 101 110
  2. 将每一组 3 位二进制数,查表转换为对应的 1 位八进制数:
    • 101 -> 5
    • 101 -> 5
    • 110 -> 6
  3. 将转换后的八进制数 ** 从左往右排列5 5 6

所以,二进制数 101101110 转换为八进制数,就是 556

4. 八进制转二进制: “一位变三位,展开转换” (技巧!)

方法: 将八进制数的 每一位直接转换为对应的 3 位二进制数

举例: 将八进制数 556 转换为二进制数。

  1. 将八进制数的每一位,查表转换为对应的 3 位二进制数:
    • 5 -> 101
    • 5 -> 101
    • 6 -> 110
  2. 将转换后的二进制数 ** 从左往右排列101 101 110

所以,八进制数 556 转换为二进制数,就是 101101110

5. 二进制转十六进制: “四位一组,按组转换” (技巧!)

方法: 将二进制数 从右往左,每 4 位分成一组 (最左边不足 4 位,用 0 补齐), 然后将每一组 4 位二进制数,直接转换为对应的 1 位十六进制数

对照表:

二进制 (4 位) 十六进制 (1 位)
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F

举例: 将二进制数 1101011110 转换为十六进制数。

  1. 将二进制数从右往左,每 4 位一组划分: 11 0101 1110 (最左边 11 不足 4 位,用 00 补齐: 0011 0101 1110
  2. 将每一组 4 位二进制数,查表转换为对应的 1 位十六进制数:
    • 0011 -> 3
    • 0101 -> 5
    • 1110 -> E
  3. 将转换后的十六进制数 ** 从左往右排列3 5 E

所以,二进制数 1101011110 转换为十六进制数,就是 35E

6. 十六进制转二进制: “一位变四位,展开转换” (技巧!)

方法: 将十六进制数的 每一位直接转换为对应的 4 位二进制数

举例: 将十六进制数 35E 转换为二进制数。

  1. 将十六进制数的每一位,查表转换为对应的 4 位二进制数:
    • 3 -> 0011
    • 5 -> 0101
    • E -> 1110
  2. 将转换后的二进制数 ** 从左往右排列0011 0101 1110 (最左边的 00 可以省略: 1101011110

所以,十六进制数 35E 转换为二进制数,就是 1101011110

掌握了这些数制转换的方法,你就能轻松地在不同 “数字语言” 之间自由切换了! 是不是感觉自己也变成了一个 “数字翻译家” 呢? 😉

🤔 为什么要学习 “数制”? (敲黑板!划重点!)

你可能会问:“老师,我学会这些 ‘数制’ 有什么用呢? 我平时都用十进制,好像也没什么问题啊?”

问得好! 👍 就像我们学习英语,虽然平时生活中可能用不到,但是,当你需要 阅读英文资料,或者和外国人交流 时,英语就变得非常重要了。 学习 “数制”,也是为了更好地理解和应用计算机技术。

学习 “数制” 的重要性:

  1. 理解计算机内部的数据表示: 计算机内部 所有的数据,最终都是以二进制形式存储和处理的。 理解二进制,是 理解计算机工作原理的基础

  2. 方便阅读和书写二进制: 八进制和十六进制,虽然不是计算机 “母语”,但它们 可以作为二进制的 “简写形式”,方便程序员 阅读和书写较长的二进制数,例如内存地址、机器指令、颜色代码等等。

  3. 进行底层编程和硬件操作: 在进行 底层编程 (例如汇编语言编程) 或者进行硬件操作 时,经常需要 直接操作二进制、八进制或十六进制数。 例如,设置寄存器、控制 I/O 端口、分析内存数据等等。

  4. 游戏行业应用: 即使是 游戏美术师、建模师、独立游戏开发者,了解数制也有助于:

    • 理解颜色代码: 颜色代码 (例如 RGB 颜色值) 经常用十六进制表示。 了解十六进制,可以更好地 理解和使用颜色,进行美术资源制作
    • 理解内存和存储: 了解二进制、八进制、十六进制,可以帮助理解 游戏资源在内存和硬盘中的存储方式和大小进行资源优化,减少游戏安装包大小,提高游戏运行效率
    • 进行性能分析和优化: 在进行 游戏性能分析和优化 时,可能需要 查看和分析底层的硬件数据 (例如内存地址、寄存器值等), 了解数制可以帮助你 更好地理解这些数据,进行性能调优

总而言之,理解 “数制”,是进入计算机世界,提升自身技能,扩展职业发展的重要一步。 无论你将来从事什么方向的计算机相关工作,扎实的 “数制” 基础,都会让你受益匪浅!

📖 总结: 掌握 “数字语言”,畅游计算机世界!

通过今天的学习,我们一起探索了计算机世界里常用的几种 “数制”: 十进制、二进制、八进制、十六进制, 以及它们之间的 互相转换方法。 你现在是不是感觉,自己对计算机的 “数字语言” 已经有了更清晰的认识了呢? 🎉

记住: 二进制是计算机的 “母语”,也是计算机世界的 “基石”; 八进制和十六进制是二进制的 “简写形式”,方便人类阅读和书写; 十进制是我们人类最熟悉的 “母语”,方便日常使用。 掌握了这些 “数字语言”,就如同掌握了 进入计算机世界的 “通行证”, 让你能够 更深入地理解计算机的奥秘,更自由地畅游于数字世界!

继续加油,探索更多计算机的 “语言” 和 “秘密” 吧! 相信你会在这个充满挑战和乐趣的学习过程中,收获满满,成为真正的 “数字达人”! 💪✨


常用数制
https://god23bin.github.io/unreal-engine-blog/2024/12/02/cs/co/co-for-beginner/number-system-and-coding/常用数制/
作者
god23bin
发布于
2024年12月2日
许可协议