进制 - 详解

世界上有10种人,懂二进制的和不懂二进制的。还有一种以为这只是个二进制笑话的。

一. 数字系统

1. 远古时期🔮:

在很久很久以前。。

  1. 结绳记事
    结绳记事
  2. 石板刻线

弊端:数字越大,越难记录😓

于是,各个地方的人类发明了更为先进的计数方法。。。

2. 非位置化数字系统:

非位置化数字系统中,符号所在位置与其大小无关,数字的大小就是各个符号所表示的大小直接相加或相减的结果。

罗马数字就是一个典型的例子:

VVV = 5 + 5 + 5 = 15 != 555

3. 位置化数字系统:

位置化数字系统中,符号所占据的位置决定了其表示的值,数字的大小需要视各个符号所表示的大小及其所在位置而定。

它包括:
二进制(Binary)/八进制(Octal)/十进制(Decimal)/十六进制(Hexadecimal)/…

555 = 500 + 50 + 5 = 555 != 15


由于非位置化数字系统效率太低,现在基本不再使用,位置化数字系统成为主流👍。

🙌因为人有十根手指头,所以很自然的选择了十进制进行数学运算。
🖥那么为什么计算机却选择使用二进制进行运算和存储呢?

二. 计算机使用二进制的原因

其实在历史上,世界上第一台通用计算机——ENIAC[1] 使用的就是十进制。
但这台计算机运行还得靠手动插线拔线,非常麻烦且不可靠:

ENIAC

后来,现代计算机之父——冯·诺依曼[2] 提出:采用二进制更有效率啊!

约翰·冯·诺依曼

这是因为计算机是由电子元件组成的,而电子元件可以非常明确的表示出两种状态:通电/断电
这两种状态非常适合用于二进制的表示:即1/0

除了硬件实现简单之外,使用二进制还有抗干扰能力强的特点:
即使电压发生轻微波动,计算机也能很容易地分辨出表示1的高电平和表示0的低电平,从而减少误差。

再其次,二进制的符号10恰好与逻辑运算中的对(true)错(false)对应,便于计算机进行逻辑运算

等等。。

三. 进制转换⇄

在学习进制转换之前,我们先要理解好十进制的本质。

1. 十进制的本质:

十进制是基数为10的数字系统,逢十进一

使用10个可用符号(0~9)来表示一个数字,数字的位置从右往左依次是个位、十位、百位、千位…,对应的权重依次为:100、101、102、103

如图:

十进制例子

这个数字的大小就等于:

1 × 103 + 1 × 102 + 4 × 101 + 5 × 100 = 1145
(由于这里权重就是在以十进制描述,因此十进制数字的大小其实就是这个数字本身)

2. 二进制的本质&二进制转换十进制:

二进制是基数为2的数字系统,逢二进一

使用2个可用符号(0&1)来表示一个数字,数字的位置从右往左依次是个位、二位、四位、八位…,对应的权重依次为:20、21、22、23

如图:

二进制例子

这个二进制数字所代表的十进制数字就是:

1 × 23 + 0 × 22 + 1 × 21 + 1 × 20 = 11

(这里我们仍然以十进制描述权重,所以所得结果就是二进制数字对应的十进制数字)


问:二进制数101001对应的十进制数?

🎉恭喜你已经学会了二进制向十进制的转换。

八进制和十六进制又是什么鬼?

3. 类比:八进制/十六进制转十进制:

Ⅰ. 八进制转十进制:

八进制的本质同理,不再赘述。

🌰栗子:八进制数277对应的十进制数?

2 × 82 + 7 × 81 + 7 × 80 = 191

Ⅱ. 十六进制转十进制:

十六进制就有点不同了,对于10~15的数字,我们采用字母A~F来进行表示

十进制 十六进制
10 A
11 B
12 C
13 D
14 E
15 F

(对于基数大于十的进制的字符替换规则同理)

🌰栗子:十六进制数2AE对应的十进制数?

2 × 162 + 10 × 161 + 14 × 160 = 686

4. 十进制转二进制:

要把十进制数转化为对应的二进制数,需要不断地将十进制数字除以2(商),获取商和余数,直到商为0,再将所得余数倒序排列,所得数字即为该十进制数对应的二进制数。

如图:

十进制转二进制

💡以下是论证过程

设已知一个二进制数字B,对应十进制数字为D
则:

B = XN…X4X3X2X1(这里的Xn都表示0或1,假设共有N位)
D = YM…Y4Y3Y2Y1 = X1 × 20 + X2 × 21 + X3 × 22 + X4 × 23 + … + XN × 2N(这里的Yn都表示0~9一整数,假设共有M位)

由于B = D,所以:

D ÷ 2 = D1 ······ m => B ÷ 2 = XN…X5X4X3X2 ······ X1(这里的Dn指第n次除以2所得的商,D1即为第一次;m表示余数0或1)

所以:(Bn表示Dn的二进制)

D1 = B1 = XN…X5X4X3X2; m = X1

继续进行以上操作,易得:

D2 = B2 = XN…X6X5X4X3; m = X2

D3 = B3 = XN…X7X6X5X4; m = X3

D4 = B4 = XN…X8X7X6X5; m = X4

DN-1 = BN-1 = XN; m = XN-1

DN = BN = 0; m = XN

商DN为0,结束。倒序排列所得余数m,得:

XNXN-1…X4X3X2X1 = B
😎


问:十进制数22对应的二进制数?

🎉恭喜你又学会了十进制向二进制的转换。

下课!(?)

其他进制呢?

5. 类比:十进制转八进制/十六进制:

Ⅰ. 十进制转八进制:

🌰栗子:十进制数900对应的八进制数?

如图:

十进制转八进制

Ⅱ. 十进制转十六进制:

🌰栗子:十进制数2717对应的十六进制数?

如图:

十进制转十六进制

6. 二进制/八进制/十六进制的互相转换:

知道了二/八/十六进制和十进制的互相转换,那么当要将二/八/十六进制进行互相转换时,是否还要大费周章地先将其转换为十进制,再将十进制转换为目标进制呢?😦

以下是一些简便的计算方法👇

  • 由于23 = 8,所以每3位二进制可以转换为一位八进制:

    🌰举个栗子:

    10111001(2) => 10|111|001 => 1 × 21 + 0 × 20|1 × 22 + 1 × 21 + 1 × 20|0 × 22 + 0 × 21 + 1 × 20 => 271(8)

  • 由于24 = 16,所以每4位二进制可以转换为一位十六进制:

    🌰举个栗子:

    10111001(2) => 1011|1001 => 1 × 23 + 0 × 22 + 1 × 21 + 1 × 20|1 × 23 + 0 × 22 + 0 × 21 + 1 × 20 => B9(16)

那么八进制又该如何转为十六进制呢?

采用二进制中转法比较简便:

步骤

  1. 先将八进制数每1位转为3位二进制(不足补零)。
  2. 将所得二进制数每4位一组转为十六进制(不足补零)。

🌰举个栗子:

271(8) => 010|111|001 => 10111001(2) => 1011|1001 => B9(16)


以上说的全部反过来,就是:

  • 八进制 → 二进制:每位八进制数展开为3位二进制。

  • 十六进制 → 二进制:每位十六进制数展开为4位二进制。

  • 十六进制 → 八进制:通过二进制中转:

    1. 十六进制 → 二进制(每1位转4位)。
    2. 二进制 → 八进制(每3位转1位)。

😎只要理解了本质,我们可以将这些进制的换算方法类推到其他所有进制!

恭喜你已经学会了进制的转换!

🎊完结撒花yeahh🎊

四. 其他の东东~

1. 存储单位:

在了解了进制后,我们还需要知道几个常用的计量单位:

  1. 比特(bit)

    表示一位二进制数字,即0或1

    是数据的最小存储单位

    例如二进制数字1011就是由4个比特组成的,分别是1、0、1、1

  2. 字节(byte)

    一个字节由8个比特组成

    1byte = 8bit

    它是计算机的基本存储单位

    1字节可以表示的最大二进制数字,是:11111111

    11111111(2) = 255(10)

它们是我们理解计算机操作和存储机制的基础。

还有其他常见单位及换算:

1KB(千字节 KiloByte) = 210B = 1024B

1MB(兆字节 MegaByte) = 210KB = 1024KB

1GB(吉字节 GigaByte) = 210MB = 1024MB

1TB(太字节 TeraByte) = 210GB = 1024GB

2. 不同进制数的读法:

如果你理解了数位,那么你就一定就能理解只有十进制才遵循“几千、几十、几百”的汉语读法
其他进制只能逐位地读出各位上的数字(或字母),并且最好说明其进制

例如:

1(2) + 1(2) = 10(2)

不能读成:

一加一等于十(?)


在线进制转换工具:

在线进制转换

参考资料:

林粒粒呀-《4分钟带你学会二进制》

我是2045-《【最强干货】详解二进制,八进制,十进制,十六进制的相互转换》


  1. ENIACElectronic Numerical Integrator And Computer ”电子数字积分计算机”)。ENIAC是继ABC(Atanasoff-Berry Computer ”阿塔纳索夫-贝瑞计算机“)之后的第二台电子计算机,和第一台通用计算机,于1946年2月14日在美国宣告诞生。ENIAC的计算速度为每秒5000次加法或400次乘法,它是完全的电子计算机,能够重新编程,解决各种计算问题。 ↩︎

  2. 约翰·冯·诺依曼John von Neumann)对世界上第一台电子计算机ENIAC(电子数字积分计算机)的设计提出过建议,1945年3月他在共同讨论的基础上起草了一个全新的“存储程序通用电子计算机方案”——EDVACElectronic Discrete Variable Automatic Computer)。这对后来计算机的设计有决定性的影响,特别是确定计算机的结构,采用存储程序以及二进制编码等,一直为电子计算机设计者所遵循。 ↩︎