目录
- 一、什么是“进制”?
- 二、常见的几种进制
- 三、二进制是什么?
- 四、为什么二进制 10 等于十进制 2?
- 五、二进制的位权
- 六、必须背下来的二进制位权
- 七、二进制转十进制
- 八、再举几个二进制转十进制例子
- 九、为什么 8 位二进制最大是 255?
- 十、十进制转二进制
- 十一、十进制转二进制:除 2 取余法
- 十二、八进制是什么?
- 十三、八进制转十进制
- 十四、十六进制是什么?
- 十五、十六进制转十进制
- 十六、再看一个十六进制
- 十七、二进制和十六进制为什么关系特别密切?
- 十八、二进制直接转十六进制
- 十九、十六进制直接转二进制
- 二十、二进制与八进制之间的关系
- 二十一、四种进制对照表
- 二十二、计算机为什么使用二进制?
- 二十三、bit 和 byte
- 二十四、为什么 1 Byte 能表示 256 种状态?
- 二十五、这和 IP 地址有什么关系?
- 二十六、子网掩码为什么必须懂二进制?
- 二十七、再看 /26
- 二十八、几个必须熟记的子网数字
- 二十九、例如 192 是怎么来的?
- 三十、224 怎么来的?
- 三十一、240 怎么来的?
- 三十二、248 怎么来的?
- 三十三、252 怎么来的?
- 三十四、254 怎么来的?
- 三十五、255 怎么来的?
- 三十六、程序中怎么表示不同进制?
- 三十七、进制转换的核心规律
- 三十八、初学者最值得背的内容
- 三十九、给你几道入门练习题
- 四十、最后用一张图理解进制
学习计算机、网络、IP 地址、子网划分时,进制是最基础的知识之一。
先记住一句话:
进制,本质上就是“逢几进一”。
十进制是“逢 10 进 1”,二进制就是“逢 2 进 1”,八进制就是“逢 8 进 1”,十六进制就是“逢 16 进 1”。
一、什么是“进制”?
我们平时习惯使用的是 十进制 Decimal。
例如:
0 1 2 3 4 5 6 7 8 9 10 11 12 ...
为什么 9 后面是 10?
因为十进制只有:
0 ~ 9
一共 10 个数字。
到了 10,就没有新的单个数字可以表示了,所以:
9 + 1 = 10
这就是:
逢十进一。
二、常见的几种进制
| 进制 | 英文 | 可用数字 | 特点 |
|---|---|---|---|
| 二进制 | Binary | 0、1 | 逢 2 进 1 |
| 八进制 | Octal | 0~7 | 逢 8 进 1 |
| 十进制 | Decimal | 0~9 | 逢 10 进 1 |
| 十六进制 | Hexadecimal | 0~9、A~F | 逢 16 进 1 |
其中计算机领域最重要的是:
二进制 十进制 十六进制
三、二进制是什么?
二进制只能使用两个数字:
0 1
所以二进制的数字变化是:
0 1 10 11 100 101 110 111 1000 1001 ...
注意:
二进制 10
不是我们平时说的“十”。
它代表:
十进制 2
也就是说:
二进制 10 = 十进制 2 二进制 11 = 十进制 3 二进制 100 = 十进制 4
四、为什么二进制 10 等于十进制 2?
这就需要理解一个非常重要的概念:
位权
我们先看十进制:
123
实际上它代表:
1 × 100 + 2 × 10 + 3 × 1
也就是:
1 × 10² + 2 × 10¹ + 3 × 10⁰
所以:
123 = 100 + 20 + 3 = 123
十进制每一位的权重分别是:
... 1000 100 10 1
10³ 10² 10¹ 10⁰
五、二进制的位权
二进制同样如此,只不过底数变成了 2。
例如:
1011
对应:
1 × 2³ 0 × 2² 1 × 2¹ 1 × 2⁰
也就是:
8 + 0 + 2 + 1 = 11
所以:
二进制 1011 = 十进制 11
六、必须背下来的二进制位权
如果以后学习:
- IP 地址
- 子网掩码
- CIDR
- VLAN
- 网络协议
下面这组数字基本必须熟悉:
| 二进制位 | 十进制值 |
|---|---|
| 2⁰ | 1 |
| 2¹ | 2 |
| 2² | 4 |
| 2³ | 8 |
| 2⁴ | 16 |
| 2⁵ | 32 |
| 2⁶ | 64 |
| 2⁷ | 128 |
| 2⁸ | 256 |
| 2⁹ | 512 |
| 2¹⁰ | 1024 |
尤其是:
128 64 32 16 8 4 2 1
建议直接背下来。
因为一个 IPv4 地址的每一段就是:
8 bit
也就是:
128 64 32 16 8 4 2 1
七、二进制转十进制
比如:
11010110
按照位权排列:
二进制: 1 1 0 1 0 1 1 0 对应: 128 64 32 16 8 4 2 1
只看数字为 1 的位置:
128 +64 +16 +4 +2
结果:
214
所以:
11010110₂ = 214₁₀
这里下标:
₂
代表二进制。
₁₀
代表十进制。
八、再举几个二进制转十进制例子
例 1
00000001
只有最后一位是 1:
= 1
所以:
00000001 = 1
例 2
00000010
= 2
例 3
00000100
= 4
例 4
00001000
= 8
例 5
11111111
计算:
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
等于:
255
所以:
11111111₂ = 255₁₀
这也是为什么 IPv4 每一段最大是:
255
比如:
192.168.1.255
九、为什么 8 位二进制最大是 255?
因为:
11111111
等于:
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
等于:
255
所以 8 bit 能表示:
0 ~ 255
总共:
256 个数字
也就是:
2⁸ = 256
注意:
能表示 256 个数,但最大数字是 255,因为从 0 开始。
十、十进制转二进制
有两种非常实用的方法。
方法一:凑数法
例如:
192
我们按照:
128 64 32 16 8 4 2 1
开始凑。
先:
192 - 128 = 64
再:
64 - 64 = 0
所以用了:
128 64
没用:
32 16 8 4 2 1
因此:
128 64 32 16 8 4 2 1 1 1 0 0 0 0 0 0
所以:
192 = 11000000
这在学习 IP 地址的时候非常好用。
例如:168 转二进制
位权:
128 64 32 16 8 4 2 1
先看:
168 - 128 = 40
64 太大,不要:
0
32 可以:
40 - 32 = 8
16 不要:
0
8 可以:
8 - 8 = 0
所以:
128 64 32 16 8 4 2 1 1 0 1 0 1 0 0 0
因此:
168 = 10101000
于是:
192.168.1.1
实际上就是:
11000000.10101000.00000001.00000001
十一、十进制转二进制:除 2 取余法
例如:
13
不断除以 2:
13 ÷ 2 = 6 余 1 6 ÷ 2 = 3 余 0 3 ÷ 2 = 1 余 1 1 ÷ 2 = 0 余 1
然后:
从下往上读余数。
所以:
1101
因此:
13₁₀ = 1101₂
验证:
8 + 4 + 0 + 1 = 13
十二、八进制是什么?
八进制:
Octal
只能使用:
0 1 2 3 4 5 6 7
没有:
8 9
所以:
八进制: 0 1 2 3 4 5 6 7 10 11 12 ...
这里:
10₈
实际上等于:
8₁₀
十三、八进制转十进制
例如:
157₈
计算:
1 × 8² + 5 × 8¹ + 7 × 8⁰
也就是:
1 × 64 + 5 × 8 + 7 × 1
结果:
64 + 40 + 7 = 111
所以:
157₈ = 111₁₀
十四、十六进制是什么?
十六进制英文:
Hexadecimal
通常简称:
Hex
十六进制需要表示:
0 ~ 15
但是我们只有:
0 ~ 9
十个数字。
怎么办?
于是规定:
A = 10 B = 11 C = 12 D = 13 E = 14 F = 15
因此:
| 十进制 | 十六进制 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 2 |
| ... | ... |
| 9 | 9 |
| 10 | A |
| 11 | B |
| 12 | C |
| 13 | D |
| 14 | E |
| 15 | F |
| 16 | 10 |
所以:
10₁₆ = 16₁₀
十五、十六进制转十进制
例如:
2A
因为:
A = 10
所以:
2A₁₆ = 2 × 16¹ + 10 × 16⁰ = 32 + 10 = 42
所以:
2A₁₆ = 42₁₀
十六、再看一个十六进制
例如:
FF
因为:
F = 15
所以:
FF = 15 × 16 + 15 = 240 + 15 = 255
所以:
FF₁₆ = 255₁₀
同时:
11111111₂ = 255₁₀ = FF₁₆
这个关系非常重要。
十七、二进制和十六进制为什么关系特别密切?
因为:
2⁴ = 16
也就是说:
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 |
建议把这个表多看几遍。
十八、二进制直接转十六进制
例如:
11010110
从右往左,每 4 位分一组:
1101 0110
分别转换:
1101 = D 0110 = 6
因此:
11010110₂ = D6₁₆
而:
D6₁₆ = 214₁₀
所以:
11010110₂ = 214₁₀ = D6₁₆
十九、十六进制直接转二进制
反过来也非常简单。
例如:
AF
A:
A = 1010
F:
F = 1111
拼起来:
AF₁₆ = 10101111₂
十进制则是:
10 × 16 + 15 = 175
所以:
AF₁₆ = 10101111₂ = 175₁₀
二十、二进制与八进制之间的关系
因为:
2³ = 8
所以:
3 位二进制 = 1 位八进制。
例如:
10111001
从右往左每 3 位分组。
不足 3 位,前面补 0:
010 111 001
分别转换:
010 = 2 111 = 7 001 = 1
所以:
10111001₂ = 271₈
二十一、四种进制对照表
这张表建议熟悉:
| 十进制 | 二进制 | 八进制 | 十六进制 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
二十二、计算机为什么使用二进制?
因为计算机底层电子电路最容易表达两种状态:
有电 / 没电 高电平 / 低电平 开 / 关 True / False
刚好可以对应:
1 0
所以计算机底层大量使用:
010101010101...
二十三、bit 和 byte
学习二进制时还有两个非常重要的概念。
bit
一个二进制位:
0
或者:
1
叫:
bit
中文:
比特 / 位
比如:
10110010
就是:
8 bit
Byte
8 bit = 1 Byte
即:
1 字节 = 8 位
例如:
11001010
就是:
1 Byte
所以:
1 Byte = 8 bit
二十四、为什么 1 Byte 能表示 256 种状态?
因为一个 bit 有:
0 1
两种可能。
8 bit:
2 × 2 × 2 × 2 × 2 × 2 × 2 × 2
也就是:
2⁸ = 256
所以一个字节:
00000000 ~ 11111111
对应十进制:
0 ~ 255
二十五、这和 IP 地址有什么关系?
IPv4 地址比如:
192.168.1.10
表面看是:
4 个十进制数字
实际上计算机内部是:
4 × 8 bit = 32 bit
192:
11000000
168:
10101000
1:
00000001
10:
00001010
因此:
192.168.1.10
真正的二进制形式:
11000000.10101000.00000001.00001010
一共:
32 bit
这也是:
IPv4 = 32 位地址
的来源。
二十六、子网掩码为什么必须懂二进制?
比如常见子网掩码:
255.255.255.0
转换成二进制:
11111111.11111111.11111111.00000000
数一下一共有多少个连续的 1:
8 + 8 + 8 = 24
所以:
255.255.255.0
也可以写成:
/24
即:
192.168.1.0/24
二十七、再看 /26
例如:
/26
意思就是前面有:
26 个 1
因此:
11111111.11111111.11111111.11000000
最后一段:
11000000
转换十进制:
128 + 64 = 192
所以:
/26
对应:
255.255.255.192
这就是二进制和子网划分最直接的关系。
二十八、几个必须熟记的子网数字
如果你是做网络、运维,这组数字非常重要:
| 二进制 | 十进制 |
|---|---|
| 00000000 | 0 |
| 10000000 | 128 |
| 11000000 | 192 |
| 11100000 | 224 |
| 11110000 | 240 |
| 11111000 | 248 |
| 11111100 | 252 |
| 11111110 | 254 |
| 11111111 | 255 |
所以子网掩码经常看到:
0 128 192 224 240 248 252 254 255
不是巧合。
它们实际上就是连续的二进制 1。
二十九、例如 192 是怎么来的?
11000000
对应:
128 64 32 16 8 4 2 1
前两位为 1:
128 + 64 = 192
所以:
11000000₂ = 192₁₀
三十、224 怎么来的?
11100000
就是:
128 + 64 + 32
所以:
224
三十一、240 怎么来的?
11110000
计算:
128 + 64 + 32 + 16
得到:
240
三十二、248 怎么来的?
11111000
计算:
128 + 64 + 32 + 16 + 8
得到:
248
三十三、252 怎么来的?
11111100
计算:
128 + 64 + 32 + 16 + 8 + 4
得到:
252
三十四、254 怎么来的?
11111110
计算:
128 + 64 + 32 + 16 + 8 + 4 + 2
得到:
254
三十五、255 怎么来的?
11111111
计算:
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
得到:
255
三十六、程序中怎么表示不同进制?
很多编程语言都会这样表示。
二进制
通常:
0b
开头。
例如:
0b1010
代表:
10
八进制
通常:
0o
例如:
0o17
代表:
15
十六进制
通常:
0x
例如:
0xFF
代表:
255
所以你以后在 Rust、Java、C、Python 等语言中看到:
0xFF
不要觉得奇怪。
意思就是:
十六进制 FF
三十七、进制转换的核心规律
实际上所有进制转换,本质上只需要掌握一个公式:
数字 × 进制^位置
比如二进制:
1011
就是:
1×2³ + 0×2² + 1×2¹ + 1×2⁰
八进制:
157
就是:
1×8² + 5×8¹ + 7×8⁰
十进制:
157
就是:
1×10² + 5×10¹ + 7×10⁰
十六进制:
1A7
就是:
1×16² + 10×16¹ + 7×16⁰
你会发现:
规则完全一样,只是底数不同。
三十八、初学者最值得背的内容
真正需要记忆的东西其实不多,重点就是:
- 二进制只有
0、1 - 八进制只有
0~7 - 十进制只有
0~9 - 十六进制是
0~9 + A~F - 二进制位权:
128 64 32 16 8 4 2 1 8 bit = 1 Byte11111111₂ = 255₁₀ = FF₁₆4 位二进制 = 1 位十六进制3 位二进制 = 1 位八进制- IPv4 一共
32 bit - IPv4 每段
8 bit /24 = 255.255.255.0
三十九、给你几道入门练习题
你可以自己先算。
第 1 题
00001010₂ = ?
答案:
8 + 2 = 10
第 2 题
11000000₂ = ?
答案:
128 + 64 = 192
第 3 题
11111111₂ = ?
答案:
255
第 4 题
10₁₀ 转二进制
答案:
00001010
第 5 题
255₁₀ 转十六进制
答案:
FF
第 6 题
1010 1111₂
转十六进制:
1010 = A 1111 = F
所以:
AF
四十、最后用一张图理解进制
可以把几种进制想成不同的“计数规则”:
数字 15
│
┌──────────┼───────────┐
│ │ │
▼ ▼ ▼
二进制 十进制 十六进制
1111 15 F
再比如:
数字 255
│
┌──────────┼───────────┐
│ │ │
▼ ▼ ▼
二进制 十进制 十六进制
11111111 255 FF
所以不要把:
11111111 255 FF
理解成三个不同的数。
实际上:
它们是同一个数,只是使用了不同的表示方式。
如果你的下一步是学习 IP 地址与子网划分,最优先把这一串彻底熟悉:
128 64 32 16 8 4 2 1
因为后面的 /24、/25、/26、/27、/28、/29、/30,本质上全部建立在这 8 个二进制位之上。