进制,简单说就是"数数的方式"。我们平时用十进制,是因为人有十根手指;计算机只能用二进制,是因为硬件上只有"通电/断电"两种状态。这篇文章把四种常用进制和它们之间的转换一次讲清楚。
1. 什么是进制
一种进制由两部分决定:基数 和位权。
- 基数:这一进制有多少个数码。二进制的数码是 0 和 1,十进制的数码是 0~9,十六进制是 0~9 和 A~F(A=10,B=11......F=15)。
- 位权:从右往左,每一位的权重是"基数的 n 次方",个位是基数⁰,十位是基数¹,以此类推。
比如十进制的 123,拆开是 1×10² + 2×10¹ + 3×10⁰。二进制 101,拆开是 1×2² + 0×2¹ + 1×2⁰ = 5。
2. 为什么计算机用二进制
不是计算机"喜欢"二进制,是硬件实现最省事。一个开关只有开和关,一个电路只有高电平和低电平,用两个状态表示 0 和 1,又稳定又便宜。要是用十进制,就得做出能稳定区分十种电压的电路,成本和出错率都受不了。
所以计算机内部的一切------数字、文字、图片、视频------最终都是 0 和 1 的串。你在屏幕上看到的这篇文章,存进内存后就是一大串二进制。
3. 其他进制转十进制:按权展开
方法:把每一位的数码乘以它的位权,然后加起来。
例:二进制 1101 → 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8+4+0+1 = 13
例:十六进制 2A → 2×16¹ + 10×16⁰ = 32+10 = 42
从右往左的位权依次是基数⁰、基数¹、基数²......别算反了就行。
4. 十进制转其他进制:除基取余
方法:一直除以目标基数,把余数从下往上排。
例:13 转二进制
13÷2=6 余 1
6÷2=3 余 0
3÷2=1 余 1
1÷2=0 余 1
从下往上读:1101,和上面按权展开的结果对上了。
例:42 转十六进制
42÷16=2 余 10(A)
2÷16=0 余 2
从下往上读:2A,也对上了。
5. 二进制和八进制、十六进制互转
这一步是偷懒用的。三位二进制正好等于一位八进制(2³=8),四位二进制等于一位十六进制(2⁴=16),所以可以直接分组转换,不用经过十进制。
例:二进制 11011011 转十六进制
分成两组:1101 1011
1101 = D,1011 = B
结果:DB
反过来也一样,把每一位十六进制拆成四位二进制就行。IP 地址、MAC 地址、Linux 文件权限里全是这种转换,学会分组法会快很多。
6. 实际应用
- IP 地址和子网掩码:192.168.1.0/24 这种写法,/24 就是二进制里 24 个连续的 1
- 颜色表示:#FF0000 是红色,就是十六进制写的
- Linux 权限:chmod 755,7=111(rwx)
- C 语言:位运算、指针、补码全是二进制在背后
7. 结尾
进制转换第一次学确实容易懵,我的经验是先盯住"按权展开"和"除基取余"这两个方法,多做几道题就顺了。二进制和十六进制的互转用分组法,基本不用过脑子。后面学子网划分、学 C 语言位运算,这些基础都会用到。