📄 一句话概括
逻辑运算对【真/假】下手、位运算对每一个二进制位下手、移位运算把整串二进制往两边推——最后那个最出人意料:左移一位等于乘 2,右移一位等于除以 2。
📝 本节和前面几节的关系
3-1 讲了二进制怎么写出来,这一篇讲二进制怎么【算】。真值表在数据库课 3-6 的 AND/OR/NOT 已经见过一次(那是对查询条件),这里下沉到二进制位级别。
一、逻辑运算:只分真假
操作对象是布尔值(true/false),三个基本件:
| a | b | a AND b(与) | a OR b(或) | NOT a(非) |
|---|---|---|---|---|
| 真 | 真 | 真 | 真 | 假 |
| 真 | 假 | 假 | 真 | 假 |
| 假 | 真 | 假 | 真 | 真 |
| 假 | 假 | 假 | 假 | 真 |
口诀:与=都要满足、或=满足一个就行、非=唱反调。编程里的 if (age >= 18 and hasTicket) 就是把两个条件用【与】捆起来。
二、位运算:对每一个二进制位做同样的逻辑运算
把两个数的二进制位上下对齐、逐位操作:
5 = 0b101
3 = 0b011
5 & 3 = 0b001 -> 1 按位与:两边都是 1 才得 1
5 | 3 = 0b111 -> 7 按位或:有 1 就得 1
5 ^ 3 = 0b110 -> 6 按位异或:不同才得 1
~5 = -6 按位取反:0 变 1、1 变 0(补码表示下等于负数减一)
最实用的三个场景:
- 掩码(mask):
x & 0b1111只留下最后四位、其余清零——像用镂空板只刷到指定区域; - 标志位(flag):一个字节的每一位当独立开关存 8 个【是/否】状态(文件权限的读/写/执行就是这么存的——回收树莓派课 4-4 的
chmod三组 4/2/1,本质就是三个二进制位); - 异或:同一个数异或两次回到原样(
5 ^ 3 ^ 3 = 5)——老式加密、奇偶校验都吃这个性质。
三、移位运算:整串往左/右推
1 << 10 # 1024 1 后面补 10 个 0 —— 恰好是 2 的 10 次方
1024 >> 3 # 128 二进制去掉右边 3 位 —— 恰好是除以 8
规律:左移 n 位=乘 2 的 n 次方,右移 n 位=除以 2 的 n 次方(取整)。因为二进制的每一位权是 2 的幂,整体挪一格就是每位权都变 2 倍(或一半)——和十进制里【数字左移一位乘 10】一模一样。
移位是计算机里最快的乘除法之一(挪线比真除法快得多),老练的代码里 x >> 1 就是【除以 2】。
四、动手 Demo:三种运算一起看
x = 0b1100 # 12
y = 0b1010 # 10
print(x & y, x | y, x ^ y) # 8 14 6
print(x & 0b0011) # 0 -> 掩码留低两位:12 的低两位是 00
print(1 << 10, 1024 >> 3) # 1024 128
看到什么算成功:输出 8 14 6、0、1024 128。
读结果:1100 & 1010 = 1000(8)——只有两边都是 1 的那一位活下来;掩码一行把 12 的高位【刷掉】只留低两位。位运算的所有答案都能用 3-1 的按权展开手工验算。
五、30 秒实验
在 Python 里跑 bin(5 ^ 3) 和 bin(6 ^ 3)——第一个输出 0b110,第二个输出 0b101(回到 5)。异或两次=抵消,30 秒亲眼验证。
六、常见误区
- 【逻辑与(and)和按位与(&)是一回事】——错。
and对整个布尔值运算(返回真/假),&对二进制位逐位运算(返回数值);对整数误用and结果会完全不同。 - 【左移就是把数字变大,随便移】——错。移位会溢出:8 位存 0b11111111 再左移,最高位的 1 就【挤丢了】(回收 3-12 的溢出)。
- 【取反 ~5 等于 -5】——错。补码表示下
~5 = -6(等于【负 5 减 1】),这是最容易被算错的一个。
自测三问(点开对答案)
1. **12 和 10 按位与的结果?** 答:1100 与 1010 逐位相与得 1000,即 8——只有两边都是 1 的位保留。 2. **为什么左移一位等于乘 2?** 答:二进制每一位的权是 2 的幂,整体左移一格每位权都翻倍,与十进制左移一位乘 10 同理。 3. **文件权限 755 与位运算什么关系?** 答:7、5、5 各是三个二进制位(读/写/执行开关)的掩码值——755 = 111 101 101,每一位就是一个独立开关。- ☐ 下一节(3-3 四则运算、运算符)
相关笔记
- 十进制数、二进制数、十六进制数 —— 位运算的对象从这来
- C++ 3.1.5 · 位运算符 —— 同一套符号在 C++ 的写法
- 树莓派 4-3 · 用户与文件权限指令 —— chmod 4/2/1 就是三个标志位
- ⌨️ 编程原理 · 索引 —— 全课路线图