⚙️ 第二章 用二进制来理解数据
📄 一句话概括

二进制就是位权为 2 的幂的计数法:从右往左依次 1、2、4、8……所以 1011 是 8+2+1=11。

📝 本节和前面几节的关系

2.1 解释了为什么用二进制,这一节说清它本身是什么、怎么和十进制互换算。

一、只有两个数字,但每一位都有【位权】

二进制只有 0 和 1 两个数字,逢二进一。 看起来单薄,但它给每一位配了一个【位权】:从右往左依次是 1、2、4、8、16…… 所以 1011 不能读成【一千零一十一】,它是 8 + 0 + 2 + 1 = 11。 位权这套记法不特殊——十进制每一位也是位权:1、10、100、1000,只不过底数是 10。

二、两条换算路子

十进制 → 二进制:不停除 2 取余数,最后把余数倒着读。 例:11 ÷ 2 余 1,5 ÷ 2 余 1,2 ÷ 2 余 0,1 ÷ 2 余 1 —— 倒着读就是 1011。 二进制 → 十进制:把那些为 1 的位的位权加起来。 例:1011 的第 4、2、1 位是 1,8 + 2 + 1 = 11。 两条路子互为逆过程,练熟两三次就习惯【一位只有 0 和 1】了。

三、位数代表什么

经常听到【8 位】【16 位】【32 位】——它说的是【一次能摆几盏灯】。 8 位能表示 0~255 共 256 个数;16 位能表示 0~65535。 规律很简单:n 位能表示 2 的 n 次方个数。 所以位数直接决定了【一次能装多大的数】,也决定了后面要讲的整数范围、溢出这些问题。

四、为什么这套表示法值得先学

因为书上后面所有内容——内存地址、补码、位运算、颜色、字符编码——都只是二进制换了种说法。 把位权这一件事吃透,后面每个新名词都只是给它换面具。

五、动手 Demo:十进制与二进制互相换算

二进制的每一位都带一个位权:从右往左依次是 1、2、4、8、16…… 所以 1011 不读一千零一十一,它是 8 + 2 + 1 = 11。

for v in [0, 1, 2, 5, 10, 11, 15, 26]:
    parts = [str(1 << i) for i in range(15, -1, -1) if v & (1 << i)]
    print("%3d -> %-8s = %s" % (v, format(v, "08b"), " + ".join(parts or ["0"])))

实跑输出:

--------------------------------------------------------------------
十进制与二进制互相换算
--------------------------------------------------------------------

**二进制的每一位都带着一个【位权】**:从右往左依次是 1、2、4、8、16……
所以 1011 不读【一千零一十一】,它是 8 + 2 + 1 = 11。

  十进制     8 位二进制     它是由哪几块拼出来的
  -----------------------------------------------
  0          00000000       0
  1          00000001       1
  2          00000010       2
  5          00000101       4 + 1
  10         00001010       8 + 2
  11         00001011       8 + 2 + 1
  15         00001111       8 + 4 + 2 + 1
  26         00011010       16 + 8 + 2

  两条换算路子:
    十进制 -> 二进制  除 2 取余数,倒着读
    二进制 -> 十进制  把是 1 的那些位的位权加起来
  例:11 除 2 依次得余数 1、1、0、1,倒着读就是 1011。

  **位权这套记法不难,难的是习惯【一位只有 0 和 1】。**

换算的两个方向:除 2 取余倒着读(十到二)、把为 1 的位的位权相加(二到十)。 底数换成 2 而已,位权这套记法在十进制里你已经用了半辈子。

30 秒实验

  1. 把今天的日期(月和日)分别写成二进制,写在纸上。
  2. 数一下:你手机号里最大的那一位,要几个二进制位才装得下?

常见误区

  1. 把 1011 读成一千零一十一。二进制里没有【十】这个数字,读法完全不同。
  2. 以为 8 位就是 8 个数。8 位是 2 的 8 次方=256 个数(0~255)。
自测三问(点开对答案) 1. 二进制的位权是什么规律? —— 从右往左依次是 1、2、4、8、16……也就是 2 的幂。 2. 1011 换成十进制是多少? —— 8 + 0 + 2 + 1 = 11。 3. n 位二进制能表示多少个数? —— 2 的 n 次方个;8 位是 256 个(0~255)。

相关笔记