人人都能学编程
English 开始学习
课程 0 · 编程之前第 3 课 / 共 8 课免费阅读

0 和 1:二进制 · 计算机入门

计算机只认识「开」和「关」。光靠这两种状态,怎么能存下数字?

课程目录

为什么需要它

计算机里的一切,从数字、消息,到照片、音乐,还有你下一门课要指挥的机器人,都是用「开」和「关」的组合存的,写成 1 和 0。

这是理解计算机最重要的一个想法,而且比听起来简单。这一课结束时,你就能用二进制数数了。

直觉理解

一块芯片里有几十亿个小开关。每个开关要么关(0),要么开(1)。一个开关就是一个比特 Bit。

一个比特只能表示两种情况。但把几个比特排在一起,组合就多起来了:

比特数组合一共几种
10、12
200、01、10、114
3000、001、010……1118
800000000……11111111256

每多一个比特,组合数就翻一倍。8 个比特叫一个字节 Byte。

怎么读二进制数。平时用的数(十进制)每一位是右边那一位的 10 倍:个位、十位、百位。二进制 Binary 里,每一位是右边那一位的 2 倍:

位值8421
比特1101

把是 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)
逐步执行
  1. L1输入:四个比特。bits = "1101"
  2. L2四个比特,最左边一位的位值是 8。place = 8
  3. L6第一位是 1:8 号灯亮。8 on
  4. L7把它的位值加进总数。total = 8
  5. L10往右每一位的位值减半:4、2、1。place = 4
  6. 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"))
逐步执行
  1. L1数 9 个数:0 到 8。how_many = 9
  2. L3每个数旁边写出它的 4 位二进制形式。3 = 0011
  3. 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)
逐步执行
  1. L1两列的标题。bits patterns
  2. L2一个比特都没有的时候,只有一种情况:什么都没有。patterns = 1
  3. L4每加一个比特就翻倍。patterns = 2
  4. L58 个比特之后:8 个 2 相乘。8 256

常见错误

二进制的 10 不是十

二进制里的 10 表示一个 2、零个 1,也就是二。看到一个数,先问它是几进制。

位值从右往左算

最右边一位值 1,往左依次是 2、4、8。反过来读就错了:0001 是 1,不是 8。

前面的 0 不改变大小

0101 和 101 都是 5,就像 007 和 7 是同一个数。

小测验

1. 二进制的 101 是多少?

  1. A101
  2. B5
  3. C3
查看答案

答案:B

位值是 4、2、1。比特 1、0、1 打开了 4 和 1:4 + 1 = 5。

2. 3 个比特一共能组成多少种不同的组合?

  1. A3
  2. B6
  3. C8
查看答案

答案:C

每个比特翻一倍:2 × 2 × 2 = 8(从 000 到 111)。

3. 哪个二进制数是 6?

  1. A0110
  2. B0011
  3. C1100
查看答案

答案:A

6 = 4 + 2,所以 4 号和 2 号灯亮:0110。(0011 是 3,1100 是 12。)

要点

  • 一个比特就是一个开关:0 或 1。8 个比特是一个字节。
  • 每多一个比特,组合数翻一倍:8 个比特有 256 种。
  • 二进制里,从右往左的位值是 1、2、4、8……把是 1 的位值加起来就是这个数。

动手练习

3 道小练习:先想一想,再动手改一改看看结果,最后自己来一次。提交马上告诉你对不对。

  1. 想一想哪几盏灯亮着?

    四盏灯分别标着 8、4、2、1,现在表示的数是 10。哪几盏灯亮着?

  2. 改一改让它变成 9

    这是二进制读数机。只改引号中间的比特,让总数变成 9。只能用 0 和 1。

    先按运行看看灯,再按提交。

  3. 自己来写出 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.