> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第17节：位运算魔法

## 课程概览

| 项目 | 内容 |
|------|------|
| 课程名称 | 位运算魔法 |
| 课程时长 | 60分钟 |
| 教学形式 | 线下互动课 + Turtle图形演示 |
| 核心概念 | 按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)、右移(>>) |

---

## 教学目标

### 知识与技能
1. 理解位运算是直接操作二进制位上的0和1
2. 掌握6种位运算的规则和效果
3. 理解左移和右移与乘除2的幂的关系
4. 能够用Python进行位运算操作

### 过程与方法
1. 通过Turtle"位运算可视化"展示每位运算过程
2. 通过身体锚点（手势）记忆6种位运算
3. 通过口诀强化记忆运算规则

### 情感态度与价值观
1. 感受位运算的"魔法感"——直接操控计算机的最底层
2. 建立"位运算是计算机的母语操作"的认知
3. 理解"规则虽然简单，但组合起来很强大"

---

## 教学重点与难点

| 类型 | 内容 | 突破方法 |
|------|------|----------|
| 教学重点 | & | ^ ~ 四种运算规则 | 口诀+身体锚点+Turtle图形 |
| 教学重点 | << 和 >> 与乘除的关系 | 对比演示+数值验证 |
| 教学难点 | 理解"按位"的含义（逐位操作） | Turtle逐位演示 |
| 教学难点 | 异或的"不同才为1" | 故事化（"找不同"游戏） |
| 教学难点 | 取反 ~ 的符号位变化 | 先用4位二进制演示（不涉及符号位） |

---

## 教学流程（60分钟 / 5段式）

---

### 第一段：导入（10分钟）——"二进制位的小把戏"

#### 活动1：开关游戏（5分钟）

**教师活动：**
- 在黑板上画两排开关（各8个）
- 每个开关可以拨到上（1）或下（0）
- 提问："如果两个开关串联（一条线路），灯亮需要什么条件？" -> 两个都开
- "如果两个开关并联（两条线路），灯亮需要什么条件？" -> 一个开就行

**引出位运算概念：**
```
串联（两个都要开）  = 按位与（&）
并联（一个开就行）  = 按位或（|）
```

**师生互动：**
```
老师："两个开关串联，什么情况下灯亮？"
学生："两个都要开！"
老师："在二进制世界，这叫'与'运算——两个都是1才得1！"
老师："那并联呢？"
学生："一个开就行！"
老师："对！这叫'或'运算——有一个1就得1！"
```

#### 活动2：身体魔法（5分钟）

**身体锚点——6种位运算手势：**

```
& (与)   = 双手都竖起大拇指  -> "两个都要好"
| (或)   = 一只手竖起大拇指  -> "一个好就行"
^ (异或) = 一只手向上，另一只向下 -> "不一样才有"
~ (取反) = 双手翻转（手心翻到手背） -> "翻个底朝天"
<< (左移) = 身体向左移一步 -> "左移变大"
>> (右移) = 身体向右移一步 -> "右移变小"
```

**全班一起做：**
- 老师说"与"，学生做双手竖拇指
- 老师说"或"，学生做单手竖拇指
- 老师说"异或"，学生做一上一下
- 老师说"取反"，学生做翻转动作
- 老师说"左移/右移"，学生做左右移步

**过渡语：**
> "今天我们要学习6种'位运算魔法'——它们是直接操作二进制位上0和1的神奇指令！学会了这些，你就掌握了电脑最底层的语言！"

---

### 第二段：知识点讲解（20分钟）——"6种位运算魔法"

#### 知识点1：按位与 &（4分钟）

**规则：** 两个都是1，结果才是1

```
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
```

**记忆钩子：**
- "& 像两个门卫都要点头"——两个都同意才放行
- "& 像串联开关"——两个都开灯才亮
- "& 像'和'——我和你都要去"

**身体锚点：** 双手都竖起大拇指（两个都要好）

**图示：**

```
  1 0 1 1 0 1 0 1    (数字A = 181)
& 1 1 0 0 1 1 0 0    (数字B = 204)
-----------------------------------
  1 0 0 0 0 1 0 0    (结果 = 132)
```

**口诀：**
> "与运算，都1才1，有0就0，严格得很"

**示例：**

```python
# 5 & 3 = ?
# 5 = 101
# 3 = 011
# & ------
# 结果 = 001 = 1
print(5 & 3)  # 输出 1
```

```python
# 12 & 10 = ?
# 12 = 1100
# 10 = 1010
# & --------
# 结果 = 1000 = 8
print(12 & 10)  # 输出 8
```

**应用场景：**
- 判断奇偶：n & 1（与1运算，看最低位）
- 掩码操作：取某个二进制位

#### 知识点2：按位或 |（3分钟）

**规则：** 只要有一个是1，结果就是1

```
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
```

**记忆钩子：**
- "| 像一个门卫点头就行"——一个人同意就可以了
- "| 像并联开关"——一个开灯就亮
- "| 像'或'——你或者我去都行"

**身体锚点：** 一只手竖起大拇指（一个好就行）

**图示：**

```
  1 0 1 1 0 1 0 1    (数字A = 181)
| 1 1 0 0 1 1 0 0    (数字B = 204)
-----------------------------------
  1 1 1 1 1 1 0 1    (结果 = 253)
```

**口诀：**
> "或运算，有1就1，全0才0，大方得很"

**示例：**

```python
# 5 | 3 = ?
# 5 = 101
# 3 = 011
# | ------
# 结果 = 111 = 7
print(5 | 3)  # 输出 7
```

#### 知识点3：按位异或 ^（4分钟）

**规则：** 两个不一样，结果才是1

```
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
```

**记忆钩子：**
- "^ 像吵架——不一样才吵"（一样就不吵了）
- "^ 像'找不同'游戏——不同才有结果"
- "异或=不同得1，相同得0"

**身体锚点：** 一只手向上另一只向下（不同方向）

**图示：**

```
  1 0 1 1 0 1 0 1    (数字A = 181)
^ 1 1 0 0 1 1 0 0    (数字B = 204)
-----------------------------------
  0 1 1 1 1 0 0 1    (结果 = 121)
```

**口诀：**
> "异或运算，不同才1，相同得0，像个裁判"

**示例：**

```python
# 5 ^ 3 = ?
# 5 = 101
# 3 = 011
# ^ ------
# 结果 = 110 = 6
print(5 ^ 3)  # 输出 6
```

**异或的魔法性质：**

```python
# 1. 自己和自己的异或 = 0
a = 123
print(a ^ a)  # 输出 0

# 2. 任何数和0异或 = 自己
print(a ^ 0)  # 输出 123

# 3. 异或可以交换
print((a ^ 5) ^ 3 == a ^ (5 ^ 3))  # 输出 True
```

#### 知识点4：按位取反 ~（3分钟）

**规则：** 0变成1，1变成0（全部翻转）

```
~0 = 1
~1 = 0
```

**记忆钩子：**
- "~ 像翻跟头——翻了就变"
- "~ 像照镜子——黑的变白的，白的变黑的"
- "~ 像负片——照片底片，颜色相反"

**身体锚点：** 双手翻转（手心翻到手背）

**图示（4位二进制简化版，不考虑符号位）：**

```
  1 0 1 0    (数字 10)
~ --------
  0 1 0 1    (结果 5)
```

**注意：** Python中的 ~ 是对有符号整数取反，规则是 ~n = -(n+1)

```python
print(~5)   # 输出 -6 （因为 ~5 = -(5+1) = -6）
print(~0)   # 输出 -1
print(~(-3))  # 输出 2
```

**简化理解（对小朋友）：**
> "取反就是0变1，1变0。但电脑里有符号的问题，所以 ~5 不是10而是-6。不过我们记住'翻个底朝天'就好，具体细节以后学！"

#### 知识点5：左移 <<（3分钟）

**规则：** 所有二进制位向左移动，右边补0

```
n << k = n x 2^k
```

**记忆钩子：**
- "左移就像数字往左走，后面跟个0——变大了！"
- "左移一位 = 乘2"（因为位权翻倍）
- "左移两位 = 乘4"
- "左移三位 = 乘8"

**身体锚点：** 身体向左移一步（左移=变大）

**图示：**

```
  0 0 0 0 0 1 0 1    (数字 5)
<< 1
-------------------
  0 0 0 0 1 0 1 0    (数字 10 = 5x2)

<< 2
-------------------
  0 0 0 1 0 1 0 0    (数字 20 = 5x4)
```

**示例：**

```python
print(5 << 1)   # 输出 10 (5 x 2)
print(5 << 2)   # 输出 20 (5 x 4)
print(5 << 3)   # 输出 40 (5 x 8)
print(1 << 8)   # 输出 256 (1 x 256，即2^8)
```

**口诀：**
> "左移一位乘2，左移n位乘2的n次方"
> "左移变大，右边补0"

#### 知识点6：右移 >>（3分钟）

**规则：** 所有二进制位向右移动，左边补0

```
n >> k = n / 2^k（整数除法，向下取整）
```

**记忆钩子：**
- "右移就像数字往右走，末尾掉了——变小了！"
- "右移一位 = 除以2"
- "右移两位 = 除以4"
- "右移n位 = 除以2的n次方"

**身体锚点：** 身体向右移一步（右移=变小）

**图示：**

```
  0 0 0 0 1 1 0 0    (数字 12)
>> 1
-------------------
  0 0 0 0 0 1 1 0    (数字 6 = 12/2)

>> 2
-------------------
  0 0 0 0 0 0 1 1    (数字 3 = 12/4)
```

**示例：**

```python
print(12 >> 1)   # 输出 6 (12/2)
print(12 >> 2)   # 输出 3 (12/4)
print(100 >> 3)  # 输出 12 (100/8=12.5，取整=12)
print(255 >> 4)  # 输出 15 (255/16=15.9375，取整=15)
```

**口诀：**
> "右移一位除以2，右移n位除以2的n次方"
> "右移变小，左边补0"

---

### 第三段：演示（10分钟）——"Turtle位运算魔法秀"

**教师操作流程：**

#### 演示1：位运算逐位对比
1. 运行 03_位运算魔法.py
2. 输入两个数字（如 5 和 3）
3. 观察Turtle画出三排方块：
   - 第一排：数字A的二进制（蓝色）
   - 第二排：数字B的二进制（红色）
   - 第三排：运算结果的二进制（绿色）
4. 选择不同的运算类型（&、|、^），观察结果变化

**关键提问：**
```
老师："看第一排和第二排，5和3的二进制分别是什么？"
学生："5=101，3=011！"
老师："那5&3呢？按位与——两个都是1才得1……结果是什么？"
学生："只有最低位两个都是1……结果是001=1！"
老师："Turtle显示的对吗？"
学生："对！"
```

#### 演示2：左移右移动画
1. 选择一个数字（如 3）
2. 展示左移：3 -> 6 -> 12 -> 24（每次乘2）
3. 展示右移：24 -> 12 -> 6 -> 3（每次除2）
4. 用Turtle动画展示二进制位的移动

#### 演示3：取反展示
1. 展示 ~5 的结果
2. 解释：取反后0变1，1变0
3. 强调Python中的规则 ~n = -(n+1)

---

### 第四段：实操练习（15分钟）——"位运算小法师"

#### 练习1：位运算规则填空（5分钟）

**任务卡：计算下列位运算的结果**

```
(1) 1 & 1 = ____
(2) 1 & 0 = ____
(3) 1 | 0 = ____
(4) 0 | 0 = ____
(5) 1 ^ 0 = ____
(6) 1 ^ 1 = ____
(7) ~0 = ____ (在4位二进制中，不考虑符号)
(8) 101(2) & 011(2) = ____(2) = ____(10)
(9) 1100(2) | 1010(2) = ____(2) = ____(10)
(10) 1010(2) ^ 0101(2) = ____(2) = ____(10)
```

**答案：**
(1)1 (2)0 (3)1 (4)0 (5)1 (6)0 (7)1 (8)001=1 (9)1110=14 (10)1111=15

#### 练习2：左移右移计算（5分钟）

**任务卡：**

```
(1) 3 << 1 = ____    (3 x 2)
(2) 7 << 2 = ____    (7 x 4)
(3) 10 << 3 = ____   (10 x 8)
(4) 16 >> 1 = ____   (16 / 2)
(5) 100 >> 2 = ____  (100 / 4)
(6) 255 >> 4 = ____  (255 / 16)
(7) 1 << 10 = ____   (2^10，即1024)
(8) 1024 >> 10 = ____ (1024 / 1024)
```

**答案：**
(1)6 (2)28 (3)80 (4)8 (5)25 (6)15 (7)1024 (8)1

#### 练习3：Python编程实操（5分钟）

**任务：在Python交互环境中输入以下代码**

```python
# 任务1：验证位运算规则
a = 5    # 二进制 101
b = 3    # 二进制 011
print("a & b =", a & b)   # 应该是 1
print("a | b =", a | b)   # 应该是 7
print("a ^ b =", a ^ b)   # 应该是 6
print("~a =", ~a)         # 应该是 -6

# 任务2：验证左移右移
n = 1
for i in range(1, 11):
    print(f"1 << {i} = {1 << i}")

# 任务3：自己出题
x = int(input("输入一个数字: "))
y = int(input("再输入一个数字: "))
print(f"{x} & {y} = {x & y}")
print(f"{x} | {y} = {x | y}")
print(f"{x} ^ {y} = {x ^ y}")
print(f"{x} << 1 = {x << 1}")
print(f"{x} >> 1 = {x >> 1}")
```

---

### 第五段：小测（5分钟）——"位运算大考验"

#### 第1关（判断题）

```
1. 按位与(&)：两个都是1才得1。 (  )
2. 按位或(|)：两个都是0才得0。 (  )
3. 按位异或(^)：不同得1，相同得0。 (  )
4. 左移一位相当于除以2。 (  )
5. 右移一位相当于乘2。 (  )
```

**答案：** 1.对 2.对(只要有一个1就是1，所以两个0才得0) 3.对 4.错(左移是乘2) 5.错(右移是除2)

#### 第2关（选择题）

```
1. 5 & 3 的结果是？
  A. 1  B. 7  C. 6  D. 15

2. 5 | 3 的结果是？
  A. 1  B. 7  C. 6  D. 15

3. 5 ^ 3 的结果是？
  A. 1  B. 7  C. 6  D. 15

4. 4 << 2 的结果是？
  A. 8  B. 12  C. 16  D. 32
```

**答案：** 1.A  2.B  3.C  4.C

#### 第3关（填空题）

```
1. 按位与的规则：两个都是____才得1。
2. 按位或的规则：只要有____就得1。
3. 按位异或的规则：____才得1。
4. 左移1位 = 乘____。
5. 右移1位 = 除____。
```

**答案：** 1.1  2.1  3.不同  4.2  5.2

---

## 板书设计

```
+-----------------------------------------------------------------+
|                 第17节：位运算魔法                                |
+-----------------------------------------------------------------+
|                                                                   |
|  运算  |  规则        |  口诀            |  身体锚点            |
|  ------+-------------+-----------------+--------------------- |
|   &    | 都1才1      |  "与"两个都要好  |  双手竖拇指          |
|   |    | 有1就1      |  "或"一个好就行  |  单手竖拇指          |
|   ^    | 不同才1     |  "异或"不一样    |  一上一下            |
|   ~    | 0变1,1变0  |  "取反"翻跟头    |  双手翻转            |
|  <<    | x2^n       |  "左移"变大      |  身体左移            |
|  >>    | /2^n       |  "右移"变小      |  身体右移            |
|                                                                   |
|  示例：5 & 3 = 1   5 | 3 = 7   5 ^ 3 = 6                        |
|       5 << 1 = 10   5 << 2 = 20   5 << 3 = 40                   |
|       12 >> 1 = 6   12 >> 2 = 3                                 |
+-----------------------------------------------------------------+
```

---

## 教学准备

### 教师准备
- PPT课件（含位运算规则表、示例）
- Python环境
- 代码文件 03_位运算魔法.py
- 随堂练习纸（打印，每人1份）
- 课后练习纸（打印，每人1份）

### 学生准备
- 笔+草稿纸
- Python环境（实操环节用）
- 手脚要活动得开（身体锚点环节）

---

## 教学反思（课后填写）

| 项目 | 评价 | 改进建议 |
|------|------|----------|
| 导入环节趣味性 | 5星 | |
| 知识点讲解清晰度 | 5星 | |
| 演示环节直观性 | 5星 | |
| 实操环节完成度 | 5星 | |
| 小测环节反馈 | 5星 | |

---

## 延伸阅读与拓展

### 给学有余力的学生

1. **位运算优先级：** ~(取反) > <<(左移) >>(右移) > &(与) > ^(异或) > |(或)
2. **复合赋值运算符：** &=, |=, ^=, <<=, >>=（类似 +=）
3. **标志位（Flag）：** 用一个整数的不同位表示不同开关状态
4. **权限控制：** Linux文件权限就用位运算控制（rwx=421）

### 位运算的"超能力"

- **速度：** 位运算比普通算术运算快很多（CPU直接支持）
- **简洁：** 一行位运算可以完成复杂判断
- **底层控制：** 直接操作硬件寄存器

### 趣味发现

```python
# 用异或交换两个数（经典面试题！）
a, b = 5, 3
a ^= b   # a = a ^ b
b ^= a   # b = b ^ a
a ^= b   # a = a ^ b
print(a, b)  # 输出 3, 5（交换成功！）
```

---

## 附录：位运算口诀全集

### 规则口诀
```
与运算(&)：都1才1，严格得很
或运算(|)：有1就1，大方得很
异或(^)：不同才1，像个裁判
取反(~)：0变1,1变0，翻个底朝天
左移(<<)：左移乘2，右移补0
右移(>>)：右移除2，左移补0
```

### 记忆口诀
```
双手竖拇指=与，两个都要好
单手竖拇指=或，一个好就行
一上一下=异或，不一样才有
双手翻转=取反，翻了就变样
身体左移=左移，变大要记住
身体右移=右移，变小别忘了
```

### 速算口诀
```
左移一位乘2，左移两位乘4
左移三位乘8，左移n位乘2^n
右移一位除2，右移两位除4
右移三位除8，右移n位除2^n
```
