8个开关,凭什么能表达256种情况?

2 阅读7分钟

8个开关,凭什么能表达256种情况?

——写给初学者的二进制入门:从"有多少种情况"到"为什么这样对应"

一、先从一个开关说起

想象你面前有一个电灯开关。它只有两种状态:关或者开。

计算机里最小的信息单位就像这个开关,叫做 位(bit,比特)。一个位只有两种取值,我们习惯用 0 和 1 来表示。

注意,0 和 1 只是我们给两种状态起的"名字"。你完全可以把它们叫做"关/开"、"黑/白"、"否/是"。后面你会发现,这一点非常重要。

二、开关越多,情况"翻倍"增长

一个开关有 2 种情况。那两个开关呢?我们把所有组合列出来:

开关1开关2
00
01
10
11

一共 4 种。再加一个开关,每一种原有的组合后面都可以接 0 或 1,情况数就翻了一倍,变成 8 种。

规律很清楚:每多一个位,情况数就乘以 2。

位数情况数写成算式
122
242×2
382×2×2
4162⁴
82562⁸

所以,8 个位(也叫 1 个字节,Byte)一共能表达 2⁸ = 256 种不同的情况。

这里有个容易踩的坑:256 是"情况的个数",而不是"最大的数"。因为我们习惯从 0 开始数,这 256 种情况对应的数是 0 到 255,最大的是 255,不是 256。

打个比方:一栋楼有 256 个房间,如果房间号从 0 号开始编,最后一个房间就是 255 号。

三、二进制和十进制怎么互相转换

1. 先回顾十进制

十进制数 352,我们为什么读作"三百五十二"?因为每一位都有自己的"分量":

352 = 3×100 + 5×10 + 2×1

从右往左,每一位的分量是 1、10、100……,每次乘以 10。这就是"逢十进一"。

2. 二进制是同样的道理

二进制只有 0 和 1,"逢二进一",所以每一位的分量是 1、2、4、8、16……,每次乘以 2。8 个位从右往左的分量是:

位的顺序(从右数)第8位第7位第6位第5位第4位第3位第2位第1位
分量1286432168421

3. 二进制 → 十进制:把"开着"的位的分量加起来

例 1:00000100 只有"4"这一位是 1,所以结果就是 4。

(这就是你可能听过的"二进制 100 等于十进制 4"。注意,这里的 100 读作"一零零",不是"一百"。)

例 2:10110101 这一串里,是 1 的位有 128、32、16、4、1,加起来:

128 + 32 + 16 + 4 + 1 = 181

再看两个极端情况:

  • 00000000 = 0(全关)
  • 11111111 = 128+64+32+16+8+4+2+1 = 255(全开)

这正好印证了前面的结论:8 位能表示 0 到 255,共 256 种。

4. 十进制 → 二进制:从大到小"凑"

把十进制数 100 转成二进制。从最大的分量 128 开始问:"装得下吗?"

分量剩余装得下吗?这一位
128100不行(128 > 100)0
64100可以,剩 361
3236可以,剩 41
164不行0
84不行0
44可以,剩 01
20不行0
10不行0

结果:100 = 01100100。

四、本质:对应关系其实是"人定的"

讲到这里,请你停下来想一个更根本的问题:

8 个开关到底"是"什么?

它们本质上只是 256 种不同的状态。至于每种状态"代表"什么,这是我们人类约定出来的,不是开关自己带的。

所以,没有任何规定说 00000100 必须代表 4。你完全可以自己规定:

  • 00000100 代表"苹果"
  • 00000101 代表"香蕉"
  • 或者把 256 种状态随便对应 256 个不同的数,打乱顺序也行

只要使用的双方约定一致,这样的规则就是"可行"的。现实中也到处都是这样的约定:

  • 字符:在 ASCII 编码里,01000001 约定为大写字母 A(它的十进制是 65)。
  • 颜色:电脑屏幕上,红、绿、蓝每个颜色通道常用 1 个字节,也就是 0~255 共 256 级亮度。
  • 同一串 0/1,不同含义:同样是 11111111,当作"普通的数"是 255;但在另一种约定里(用来表示负数的"补码"),它表示 -1。

最后一点很能说明问题:0 和 1 本身没有意义,意义来自约定。

五、那为什么大家还是用"标准的"对应方式?

既然可以随便对应,为什么全世界的计算机基本都用"按分量相加"的方式(1、2、4、8……)呢?因为这种对应方式特别好用。

我们来做个对比。假设只有 3 个开关(8 种状态),下面是两种对应方式:

状态标准对应(分量 4、2、1)随便对应(打乱的)
00005
00112
01027
01130
10043
10156
11061
11174

两种都是"一个状态对一个数,不重复不遗漏",从信息量上讲都没问题。但用起来差别巨大:

1. 标准对应有规律,不用死记 随便对应要靠一张对照表,256 种状态就要记 256 条,而且换一个人可能用另一张表。标准对应只需要记住一条规则:每一位的分量是 1、2、4、8……,就能推出所有情况。

2. 标准对应可以直接做运算 试试 3 + 1:

  011   (3)
+ 001   (1)
-----
  100   (4)

你会发现,这和十进制的竖式加法一模一样:满 2 就向前进 1。电路只要实现"逢二进一"这一条规则,就能做加法。

用"随便对应"呢?011 是 0,001 是 2,结果应该是 2,也就是 001。但开关层面完全看不出规律,每一种加法都得查表,电路会复杂得多。

3. 标准对应让"大小"一目了然 从左往右,第一个不同的位谁是 1,谁就更大。比较大小不用查表。随便对应则做不到。

4. 标准对应方便扩展 8 位不够用,就再加一位,变成 9 位,能表示的范围刚好翻倍,而且原来的规则完全不用改。

5. 标准对应和硬件天然匹配 每个位就是一个独立的开关(电路里的高/低电压),各管各的分量,设计起来最简单。

总结一下:"随便对应"在原理上是允许的,但"标准对应"让计算变得简单、统一、可扩展。 计算机选择它,不是因为它是唯一的办法,而是因为它是最省事、最好用的办法。

六、小结

  1. 一个位有 2 种状态;每多一个位,情况数翻倍。
  2. 8 位一共有 2⁸ = 256 种情况,对应十进制的 0~255。
  3. 二进制每一位的分量是 1、2、4、8、16、32、64、128,把"是 1"的位的分量加起来,就得到十进制数。
  4. 本质上,位串只是一些状态,含义是人约定的,可以任意对应。
  5. 我们通常用"按分量相加"的对应方式,是因为它有规律、能直接运算、好比较、易扩展。

七、小练习

  1. 二进制 00001010 是十进制的多少?
  2. 十进制的 37 用 8 位二进制怎么写?
  3. 6 个位一共能表达多少种情况?
  4. 如果要表达 1000 种不同的情况,至少需要几个位?

参考答案

  1. 8 + 2 = 10
  2. 37 = 32 + 4 + 1,写作 00100101
  3. 2⁶ = 64 种
  4. 2⁹ = 512 不够,2¹⁰ = 1024 够了,所以至少需要 10 位