Skip to main content

进位制

认识进制

  • 进制的概念:

    • 维基百科:进位制是一种记数方式,亦称位置记法(positional notation)、进位记数法、位值记数法(place-value notation)、位置数值系统(positional numeral system);利用这种"记数法",可以使用有限种"数字符号"来表示所有的数值。
    • 通俗理解:当数字达到某个值时,进一位 (比如从 1 位变成 2 位)。
  • 按照进制的概念,来理解一下十进制:

    • 当数字到 9 的时候,用一位已经表示不了了,那么就进一位变成 2 位。
    • 在东北没有什么是一顿烧烤不能解决的,如果有,那就两顿。
  • 按照上面的来理解,二进制、八进制、十六进制:

    • 二进制:当数字到 1 的时候,用一位已经表示不了了,那么就进一位。
    • 八进制:当数字到 7 的时候,用一位已经表示不了了,那么就进一位。
    • 十六进制:等等,用一位如何表示十六个数字呢?a(10)、b(11)、c(12) 、d(13) 、e(14) 、f(15)
  • 常见进位制及用途

    底/基数名称描述
    10十进制世界上最常见的算术运算位进制系统,它是 2 和 5 的乘积,用于大多数机械计数器。其十位数字为 "0-9"。
    12十二进制因为有多个约数如 2,3,4 和 6 的易于整除性,它传统上用以表示数量和总数,如一打即为十二个单位。十二位数字为"0-9",接着是"A"和"B"。
    20二十进制因为有多个约数如 2,4,5 和 10 的易于整除性,在几种传统文化中的数字系统,仍然被用于计数。二十位数字为"0-9",接着是"A-J"。
    2二进制几乎所有的电子计算机内部都使用二进位制,分别为"0"和"1"表示"关"和"开"。用于大多数电子计数器。
    16十六进制经常用于计算机领域,2 到 4 次幂。十六位数字为"0-9",接着是"A-F"。
    8八进制偶尔用于计算机领域,2 到 3 次幂。八位数字为"0-7"。
    60六十进制起源于古代苏美尔并传给巴比伦人。六十成为 3,4 和 5 的乘积。今天用作现代圆形坐标系(度,分,秒)和时间测量(小时,分钟和秒)的基础。
    5五进制一般用于计算票数,"T"代表 2,"正"代表 5。正字一笔等于一。
    • 八进位制和十六进位制系统通常用于计算机领域,因为它们可方便当作二进位制的简写。
    • 十六进位制数字对应于四位二进位制数字的序列,因为十六是二的四次方; 例如,十六进位制 7816 是二进制 11110002。
    • 八进位制数和二进位制的数字序列之间也有类似关系,因为八是二的立方。底数通常是自然数。然而,其它位进制系统也是可能的。黄金比率底数(其底为非整数代数)和负底数(其底为负数)。

人类的十进制

  • 学习编程语言,需要了解进制的概念:

    • 我们平时使用的数字都是十进制的,当我写下一个数字的时候,你会默认当做十进制来使用。
    • 从发明数字的开始,人类就使用十进制,原因可能是人类正好十根手指。亚里士多德称人类普遍使用十进制,只不过是绝大多数人生来就有 10 根手指这样一个解剖学事实的结果。
    • 如果人类有八根手指,现在用的可能是八进制
  • 所以说,十进制就是放之四海而皆准的常理吗?

  • 并不见得,计算机就认为二进制、八进制、十六进制更符合自己的思维。

计算机中的进制

  • 为什么计算机更喜欢二进制呢?

    • 前面我们已经介绍过了为什么计算机更喜欢二进制了;
    • 和其底层的原理有关系;
  • 如何表示二进制、八进制、十六进制?

    • 二进制(0b 开头,binary):其中的数字由 0、1 组成,可以回顾之前学习过的机器语言。
    • 八进制(0o 开头,Octonary):其中的数字由 0~7 组成。
    • 十六进制(0x 开头,hexadecimal):其中的数字由 0~9 和字母 a-f 组成(大小写都可以)
  • 十进制 or 二进制:

    • 虽然计算机更喜欢二进制,但是编程中我们还是以十进制为主。
    • 因为高级编程语言的目的就是更加接近自然语言,让我们人类更容易理解。

进制之间的转换

  • 十进制转其他进制:

    • 整除,取余数。
  • 其他进制转十进制:

    • 一般说来,b 进制有 b 个数字,如果 a3, a2, a1, a0 是其中四个数字,那么就有 a3a2a1a0 = a3 * b3 + a2 * b2 + a1 * b1 + a0 * b0。 注意,a3a2a1a0 表示一个数字序列,而不是数字的相乘。
    • 比如二进制的 1001 转成十进制:1 * 23 + 0 * 22 + 0 * 2 + 1 = 9
    • 比如八进制的 1234 转成十进制:1 * 83 + 2 * 82 + 3 * 8 + 4 = 668
    • 比如十六进制的 522 转成十进制:5 * 162 + 2 * 16 + 2 = 1314
  • 二进制转八进制:

    • 三位转成一位八进制
  • 二进制转十六进制:

    • 四位转成一位十六进制
  • 如果 520 情人节忘记了,给大家一个建议,在 522 那天过,因为十六进制的 522,对应的十进制是 1314。