0 和 1:二进制 · 计算机入门
计算机只认识「开」和「关」。光靠这两种状态,怎么能存下数字?
课程目录为什么需要它
计算机里的一切,从数字、消息,到照片、音乐,还有你下一门课要指挥的机器人,都是用「开」和「关」的组合存的,写成 1 和 0。
这是理解计算机最重要的一个想法,而且比听起来简单。这一课结束时,你就能用二进制数数了。
直觉理解
一块芯片里有几十亿个小开关。每个开关要么关(0),要么开(1)。一个开关就是一个比特 Bit。
一个比特只能表示两种情况。但把几个比特排在一起,组合就多起来了:
| 比特数 | 组合 | 一共几种 |
|---|---|---|
| 1 | 0、1 | 2 |
| 2 | 00、01、10、11 | 4 |
| 3 | 000、001、010……111 | 8 |
| 8 | 00000000……11111111 | 256 |
每多一个比特,组合数就翻一倍。8 个比特叫一个字节 Byte。
怎么读二进制数。平时用的数(十进制)每一位是右边那一位的 10 倍:个位、十位、百位。二进制 Binary 里,每一位是右边那一位的 2 倍:
| 位值 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|
| 比特 | 1 | 1 | 0 | 1 |
把是 1 的那些位值加起来:8 + 4 + 1 = 13。所以二进制的 1101 就是 13。
想象四盏灯,分别标着 8、4、2、1。要表示一个数,就把加起来等于它的那几盏灯打开。右边的机器做的就是这件事:改一改引号里的 0 和 1,再运行。
定义
比特 Bit
A bit (binary digit) is the smallest unit of data in a computer; it has one of two values, 0 or 1.比特(二进制位)是计算机里最小的数据单位,只有两种取值:0 或 1。
二进制 Binary
Binary is a way of writing numbers with only the digits 0 and 1, where each place is worth twice the place to its right.二进制是只用 0 和 1 两个数字来写数的方法,每一位的值是它右边那一位的两倍。
字节 Byte
A byte is a group of 8 bits, enough for 256 different values.一个字节是 8 个比特,可以表示 256 种不同的值。
示例
二进制读数机
动手试试每一行是一盏灯,从最大的位值一直到 1。试试 0110、1000 或 11111111。不用看懂代码,只改引号中间的内容就行。
bits = "1101" # change me 改这里: only 0 and 1
place = 2 ** (len(bits) - 1)
total = 0
for bit in bits:
if bit == "1":
print(place, "on")
total = total + place
else:
print(place, "off")
place = place // 2
print(bits, "=", total)- L1输入:四个比特。
bits = "1101" - L2四个比特,最左边一位的位值是 8。
place = 8 - L6第一位是 1:8 号灯亮。
8 on - L7把它的位值加进总数。
total = 8 - L10往右每一位的位值减半:4、2、1。
place = 4 - L11四盏灯都看完:8 + 4 + 1。
1101 = 13
用二进制数数
动手试试看最右边那一位:每次都在变。左边一位每 2 次变一下,再左边一位每 4 次变一下。就像一个只有 0 和 1 的里程表。
how_many = 9 # change me 改这里
for n in range(how_many):
print(n, "=", format(n, "04b"))- L1数 9 个数:0 到 8。
how_many = 9 - L3每个数旁边写出它的 4 位二进制形式。
3 = 0011 - L38 要用到第四盏灯:1000。
8 = 1000
每多一位,翻一倍
动手试试多一个比特,组合数就翻一倍。所以一个字节(8 个比特)能表示 256 种不同的值:0 到 255。
print("bits", "patterns")
patterns = 1
for bits in range(1, 9):
patterns = patterns * 2
print(bits, patterns)- L1两列的标题。
bits patterns - L2一个比特都没有的时候,只有一种情况:什么都没有。
patterns = 1 - L4每加一个比特就翻倍。
patterns = 2 - L58 个比特之后:8 个 2 相乘。
8 256
常见错误
二进制的 10 不是十
二进制里的 10 表示一个 2、零个 1,也就是二。看到一个数,先问它是几进制。
位值从右往左算
最右边一位值 1,往左依次是 2、4、8。反过来读就错了:0001 是 1,不是 8。
前面的 0 不改变大小
0101 和 101 都是 5,就像 007 和 7 是同一个数。
小测验
1. 二进制的 101 是多少?
查看答案
答案:B
位值是 4、2、1。比特 1、0、1 打开了 4 和 1:4 + 1 = 5。
2. 3 个比特一共能组成多少种不同的组合?
查看答案
答案:C
每个比特翻一倍:2 × 2 × 2 = 8(从 000 到 111)。
3. 哪个二进制数是 6?
查看答案
答案:A
6 = 4 + 2,所以 4 号和 2 号灯亮:0110。(0011 是 3,1100 是 12。)
要点
- 一个比特就是一个开关:0 或 1。8 个比特是一个字节。
- 每多一个比特,组合数翻一倍:8 个比特有 256 种。
- 二进制里,从右往左的位值是 1、2、4、8……把是 1 的位值加起来就是这个数。
动手练习
3 道小练习:先想一想,再动手改一改看看结果,最后自己来一次。提交马上告诉你对不对。
- 想一想哪几盏灯亮着?
四盏灯分别标着 8、4、2、1,现在表示的数是 10。哪几盏灯亮着?
- 改一改让它变成 9
这是二进制读数机。只改引号中间的比特,让总数变成 9。只能用 0 和 1。
先按运行看看灯,再按提交。
- 自己来写出 12 的二进制
用 8、4、2、1 四盏灯,写出 12 的二进制。从 8 开始,亮的灯写 1,灭的灯写 0。
可以用右边的二进制读数机检查你的答案。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Bit | 比特 | The smallest unit of data: a single 0 or 1. |
| Byte | 字节 | A group of 8 bits; it can hold 256 different values. |
| Binary | 二进制 | Writing numbers with only 0 and 1, each place worth twice the one to its right. |
| Decimal | 十进制 | The everyday number system, with digits 0 to 9 and places worth ones, tens, hundreds. |
| Place value | 位值 | How much a digit is worth because of where it stands in a number. |