> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第18节：位运算实战

## 课程概览

| 项目 | 内容 |
|------|------|
| 课程名称 | 位运算实战 |
| 课程时长 | 60分钟 |
| 教学形式 | 线下互动课 + Turtle图形演示 |
| 核心概念 | 奇偶判断、交换数值、掩码操作、2的幂判断、快速乘除 |

---

## 教学目标

### 知识与技能
1. 掌握用位运算判断奇偶（n & 1）
2. 掌握用异或交换两个变量值
3. 理解掩码的概念和用法（n & mask）
4. 掌握用位运算判断2的幂（n & (n-1)）
5. 理解左移右移在快速计算中的应用

### 过程与方法
1. 通过"魔法秀"展示位运算的实用性
2. 通过Turtle图形展示RGB颜色通道提取
3. 通过对比实验展示位运算的速度优势

### 情感态度与价值观
1. 建立"位运算是程序员的实用工具"的认知
2. 感受位运算带来的"效率超能力"
3. 理解底层知识在实际编程中的价值

---

## 教学重点与难点

| 类型 | 内容 | 突破方法 |
|------|------|----------|
| 教学重点 | 6种实战技巧的掌握 | 口诀+代码+图形三重强化 |
| 教学重点 | 掩码操作的理解 | Turtle颜色通道提取演示 |
| 教学难点 | 异或交换原理 | 逐位推演+Turtle动画 |
| 教学难点 | n & (n-1) 判断2的幂 | 二进制位变化图解 |

---

## 教学流程（60分钟 / 5段式）

---

### 第一段：导入（10分钟）——"位运算的超能力"

#### 活动1：复习大闯关（5分钟）

**快速问答（复习上节课内容）：**

```
老师："&的规则是什么？"
学生："都1才1！"
老师："|的规则是什么？"
学生："有1就1！"
老师："^的规则是什么？"
学生："不同才1！"
老师："左移一位等于？"
学生："乘2！"
老师："右移一位等于？"
学生："除2！"
```

**身体锚点复习：**
- 老师说运算符号，全班做手势
- "&" -> 双手竖拇指
- "|" -> 单手竖拇指
- "^" -> 一上一下
- "~" -> 双手翻转
- "<<" -> 身体左移
- ">>" -> 身体右移

#### 活动2：超能力展示（5分钟）

**教师表演：**

> "今天我要展示位运算的'超能力'！"

**超能力1：一眼看穿奇偶**
```
老师："随便说一个数！"
学生："127！"
老师："奇数！"
学生："246！"
老师："偶数！"
老师："我是怎么瞬间判断的？——看二进制最低位！"
```

**超能力2：隔空交换**
```
老师："我这里有两个杯子，A杯里有5颗糖，B杯里有3颗糖。
       我不借助第三个杯子，怎么能交换它们？"
学生："……（思考）"
老师："位运算可以！看好了！"
```

**超能力3：2的幂探测器**
```
老师："我说一个数，你马上判断它是不是2的幂！"
老师："64！" 学生："是！"
老师："100！" 学生："不是！"
老师："怎么做到的？用 n & (n-1) == 0 一招搞定！"
```

**过渡语：**
> "今天我们就来学习这些'超能力'！它们不是魔法，是位运算的实战技巧！学会了，你也能像电脑一样快速判断和计算！"

---

### 第二段：知识点讲解（20分钟）——"6种实战技巧"

#### 技巧1：判断奇偶 — n & 1（3分钟）

**原理：** 二进制的最低位（第0位）决定奇偶
- 奇数：最低位 = 1
- 偶数：最低位 = 0

```
奇数示例：5 = ____101    (最低位=1)
                   ^--- 第0位
偶数示例：6 = ____110    (最低位=0)
                   ^--- 第0位
```

**判断方法：** `n & 1`
- 结果为 1 -> 奇数
- 结果为 0 -> 偶数

**对比：**
```python
# 传统方法
if n % 2 == 1:  # 用取模
    print("奇数")

# 位运算方法（更快！）
if n & 1:       # 用位运算
    print("奇数")
```

**为什么更快：** % 需要做除法运算，而 & 1 只检查最后一位，CPU的"与"操作比"除法"快得多！

**【身体锚点 #1：末位警察】**

> 动作：右手比"1"手势（食指朝天），左手拖住右手肘。
> - 左手握拳然后伸1根手指 → 表示"最低位是1，奇数！"
> - 左手握拳不伸 → 表示"最低位是0，偶数！"
>
> 全班喊着口号做动作："末位警察看一看，1奇0偶一瞬间！"

**教师引导语：**
> "想象二进制数的最后一位是'末位警察'——他只看你最后一位！
> 你拿数字5（101）给他看，最后一位是1——'奇数，过去吧！'
> 你拿数字6（110）给他看，最后一位是0——'偶数，过去吧！'"

**全班互动游戏：**
```
师：15！     生：（右手比1，左手伸1指）"奇数！"
师：42！     生：（右手比1，左手握拳）"偶数！"
师：101！    生：（右手比1，左手伸1指）"奇数！"
师：2024！   生：（右手比1，左手握拳）"偶数！"
```

**【记忆钩子 #1：排队最后一个人】**

> 🎭 **比喻**：二进制的最低位就像"排队最后一个人"。
> - 最后一个人是男生（1）→ 队伍是奇数
> - 最后一个人是女生（0）→ 队伍是偶数
>
> 你不需要数整个队伍有多少人，只看最后一个人是男是女就知道队伍是单数还是双数！
> n & 1 就是这么做的——只看最低位！

**课堂口诀：**
> "n & 1，看末位，1奇0偶不费力！
>  位运算比取模快，CPU见了笑嘻嘻！"

#### 技巧2：判断两个数是否相等 — (a ^ b) == 0（3分钟）

**原理：** 异或的性质——相同为0，不同为1
- 如果 a == b，那么 a ^ b = 0（所有位都一样）
- 如果 a != b，那么 a ^ b != 0（至少有一位不同）

**判断方法：** `(a ^ b) == 0` 成立时 a 等于 b

**示例：**
```python
a = 5
b = 5
print(a ^ b)      # 输出 0，说明相等

a = 5
b = 3
print(a ^ b)      # 输出 6，说明不相等
```

**【身体锚点 #2：对对碰消消乐】**

> 动作：双臂在胸前水平交叉成"X"形（代表异或 ^ ）。
> - 当老师说"两个数相等"时，双臂快速向下挥开 → "砰！变成0！"
> - 当老师说"两个数不等"时，双臂保持交叉 → "还在！不是0！"
>
> 全班喊着口号做动作："异或异或，相同归零，不同留1！"

**教师引导语：**
> "异或就像'找不同'游戏——两张图放在一起，完全相同的地方就消失变成0！
> 如果两张图100%一样，那整张图就全消失了，结果就是0！"

**全班互动游戏：**
```
师：5和5！       生：（交叉臂→向下挥开）"相等！"
师：7和3！       生：（交叉臂保持不动）"不相等！"
师：100和100！   生：（交叉臂→向下挥开）"相等！"
师：255和0！     生：（交叉臂保持不动）"不相等！"
```

**【记忆钩子 #2：一模一样复印机】**

> 🎭 **比喻**：异或就像"神奇复印机"。
> - 你把两张纸叠在一起对着光看——完全一样的地方变成透明（0）
> - 如果所有地方都一样 → 整张纸都透明了（结果为0 ✅）
> - 如果有一个地方不同 → 纸不透明（结果不为0 ❌）
>
> 等你学会了，看一眼 (a ^ b) == 0 就知道两个数是不是一模一样！

**课堂口诀：**
> "a异或b等于0，两数相等一定行！
>  相同归零不同留1，异或性质要记清！"

#### 技巧3：交换两个数 — 异或交换法（4分钟）

**原理：** 利用异或的三个性质：
1. a ^ a = 0（自己和自己异或得0）
2. a ^ 0 = a（任何数和0异或得自己）
3. 异或满足交换律和结合律

**三步交换法：**
```python
a = 5    # 二进制 101
b = 3    # 二进制 011

a ^= b   # a = a ^ b  ->  a = 101 ^ 011 = 110 = 6
b ^= a   # b = b ^ a  ->  b = 011 ^ 110 = 101 = 5  (b变成了原来的a!)
a ^= b   # a = a ^ b  ->  a = 110 ^ 101 = 011 = 3  (a变成了原来的b!)
# 完成交换！a=3, b=5
```

**逐位推演：**

```
初始: a = 101, b = 011

第1步: a = a ^ b = 101 ^ 011 = 110
第2步: b = b ^ a = 011 ^ 110 = 101  (现在b等于原来的a)
第3步: a = a ^ b = 110 ^ 101 = 011  (现在a等于原来的b)

结果: a=011(3), b=101(5)  ✨ 交换成功！
```

**【身体锚点 #3：魔法三人转】**

> 动作：这个技巧需要三步，用身体演绎：
> 1️⃣ 第一步（a ^= b）：左手拉右手转半圈 → 代表"a和b混合了"
> 2️⃣ 第二步（b ^= a）：右手往回拉左手转半圈 → 代表"b变成了原来的a"
> 3️⃣ 第三步（a ^= b）：左手再拉右手转半圈 → 代表"a变成了原来的b"
>
> 全班站起来，跟着口号做动作：
> "一转！二转！三转！交换完成！"

**教师引导语（用实物演示）：**
> "拿两个杯子，A杯橙汁，B杯牛奶。没有第三个杯子怎么交换？
> 异或交换就像'混合再分离'——先把A和B倒在一起（第一步），
> 然后倒回B（B拿到了A原来的），再倒回A（A拿到了B原来的）！
> 魔法完成了！"

**全班互动游戏：**
```
师：a=3,b=5，第一步！  生：（左手拉右手转半圈）"a变混合！"
师：第二步！          生：（右手拉左手转半圈）"b变原来的a！"
师：第三步！          生：（左手再拉右手转半圈）"a变原来的b！"
师：结果？            生：齐喊"a=5,b=3！"
```

**【记忆钩子 #3：三角传秘密】**

> 🎭 **比喻**：三个朋友A、B、C传秘密：
> - A有一个秘密"5"，B有一个秘密"3"
> - 第1步：A把秘密和B的秘密"混合"成一个新密码
> - 第2步：B用混合密码解出自己的秘密，结果拿到了A的"5"
> - 第3步：A再用混合密码解出B的秘密"3"
> - 最后：A知道了B的秘密"3"，B知道了A的秘密"5" — 交换成功！
>
> 不需要第三个朋友帮忙，两个人就能交换秘密！

**课堂口诀：**
> "三步异或真奇妙，a^b→b^a→a^b，
>  不用帮手就换好，同学见了都叫好！"

#### 技巧4：掩码操作 — 取末k位（4分钟）

**原理：** 用掩码（mask）提取指定的二进制位

**掩码公式：** `mask = (1 << k) - 1`
- 1 << k = 2^k（二进制中1后面跟k个0）
- (1 << k) - 1 = k个1（掩码）

```
示例：k=3
1 << 3 = 1000(2) = 8
(1 << 3) - 1 = 0111(2) = 7  -> 这就是掩码（3个1）
```

**提取末k位：** `n & ((1 << k) - 1)`

**示例：从数字中提取最后3位**
```python
n = 0b11010101  # 十进制 213
k = 3
mask = (1 << k) - 1  # mask = 0b111 = 7
result = n & mask    # 提取最后3位
print(bin(result))   # 输出 0b101（最后3位）
```

**图示：**
```
    n = 1 1 0 1 0 1 0 1
  mask = 0 0 0 0 0 1 1 1  (= 7)
  &   --------------------
result = 0 0 0 0 0 1 0 1  (= 5, 即最后3位)
```

**颜色通道提取（实战应用）：**
```python
# RGB颜色：每8位一个通道
color = 0xAABBCC
# 提取红色通道（高8位）
R = (color >> 16) & 0xFF   # 0xFF = 255 = 11111111
# 提取绿色通道（中间8位）
G = (color >> 8) & 0xFF
# 提取蓝色通道（低8位）
B = color & 0xFF
print(f"R={R}, G={G}, B={B}")  # 输出 R=170, G=187, B=204
```

**【身体锚点 #4：截尾剪刀手】**

> 动作：
> - 左手伸出k根手指（表示要取末k位）
> - 右手做"剪刀"手势（食指和中指比V形），在左手手指上"咔嚓"剪一下
> - 然后左手只保留最下面的k根手指，其他收起
>
> 全班喊着口号："掩码一剪咔咔咔，末k位全留下！"

**教师引导语：**
> "二进制数就像一长串数字长龙，掩码就像一把'智能剪刀'。
> 你说要取末3位，剪刀就'咔'一下，只留下最后3位，前面的全剪掉！
> 这把剪刀是怎么做的？(1<<k)-1 就是剪刀的'刀刃'！"

**全班互动游戏：**
```
师：取13（1101）的末2位！
生：（左伸2指，右剪刀咔嚓左手指尖）"1101咔嚓→01=1！"

师：取30（11110）的末3位！
生：（左伸3指，右剪刀咔嚓）"11110咔嚓→110=6！"

师：取100（1100100）的末4位！
生：（左伸4指，右剪刀咔嚓）"1100100咔嚓→0100=4！"
```

**【记忆钩子 #4：电影遮幅特效】**

> 🎭 **比喻**：掩码就像电影里的遮幅效果。
> - 一张大照片，你只想看右下角那一小块
> - 你用一张黑纸（掩码）盖住照片，只剪开右下角k×k大小的窗口
> - 透过这个窗口，你只能看到照片的右下角那一块
>
> 在计算机里，(1<<k)-1 就是那张黑纸上的"窗口"，& 就是盖上去的动作！
> n & ((1<<k)-1) 的结果就是——透过窗口看到的k个二进制位！

**课堂口诀：**
> "1左移k再减1，k个1来做掩码，
>  与运算咔一剪，末k位全拿下！"

#### 技巧5：快速乘除2的幂（3分钟）

**原理：** 左移乘2的幂，右移除2的幂

```python
# 快速乘法
n * 8 = n << 3      # 左移3位
n * 16 = n << 4     # 左移4位
n * 256 = n << 8    # 左移8位

# 快速除法
n // 8 = n >> 3     # 右移3位（注意是整数除法）
n // 16 = n >> 4    # 右移4位
n // 256 = n >> 8   # 右移8位
```

**速度对比：**

```python
import time

n = 123456789

# 乘法 vs 左移
start = time.time()
for _ in range(1000000):
    r = n * 256
print("乘法耗时:", time.time() - start)

start = time.time()
for _ in range(1000000):
    r = n << 8
print("左移耗时:", time.time() - start)
# 左移比乘法快很多！
```

**记忆钩子：**
> "左移是快车，乘2的幂张；右移是快车，除2的幂王"

**【身体锚点 #5：移位滑梯跷跷板】**

> 动作：全班站起来，想象自己站在一个"二进制跷跷板"上。
> - << 左移 → 全班跳向左边，身体向上伸展，嘴里发"呜~~"（声音往上扬，表示数字变大）
> - >> 右移 → 全班蹲低一点，身体向下缩，嘴里发"嗖~~"（声音往下降，表示数字变小）
>
> 教师喊数字和移位次数：
> "3左移2位！" → 学生跳两次，边跳边喊"呜~呜~6，12！"
> "16右移3位！" → 学生蹲三次，边蹲边喊"嗖~嗖~嗖~8，4，2！"

**教师引导语：**
> "左移就是数字在二进制里往高位搬家——每搬一次就乘以2！
> 就像你上楼梯，每上一层就翻一倍高！
> 右移就是下楼梯，每下一层就矮一半！"

**全班互动游戏：**
```
师：5左移1！   生：（跳一次）"10！"
师：5左移2！   生：（跳两次）"20！"
师：5左移3！   生：（跳三次）"40！"
师：40右移1！  生：（蹲一次）"20！"
师：40右移2！  生：（蹲两次）"10！"
师：40右移3！  生：（蹲三次）"5！"
```

**【记忆钩子 #5：爬楼梯和下楼梯】**

> 🎭 **比喻**：二进制移位就像爬楼梯。
> - 你站在一楼（数字5），左移1位就是上到二楼（×2=10）
> - 再左移1位就是上到三楼（再×2=20）
> - 右移就是下楼梯——从三楼下一层就到二楼（÷2）
>
> 重点：计算机做移位比做乘除法快得多！
> 就像你爬楼梯比坐电梯快——啊不对，是坐电梯比爬楼梯快！
> 移位就是计算机的"高速电梯"！

**课堂口诀：**
> "左移×2上楼梯，右移÷2下楼梯，
>  位运算比乘除快，CPU高速电梯来！"

#### 技巧6：判断2的幂 — n & (n-1) == 0（3分钟）

**原理：** 2的幂的二进制只有一个1（最高位），其余全是0

```
1  = 00000001  (只有一个1)
2  = 00000010  (只有一个1)
4  = 00000100  (只有一个1)
8  = 00001000  (只有一个1)
16 = 00010000  (只有一个1)
```

**关键观察：** 如果 n 是2的幂，那么 n-1 会把那个1变成0，把后面的所有0变成1

```
示例：n = 8  (1000)
n-1 = 7  (0111)
n & (n-1) = 1000 & 0111 = 0000 = 0  ✔ 是2的幂！

示例：n = 10 (1010)
n-1 = 9  (1001)
n & (n-1) = 1010 & 1001 = 1000 = 8  ≠ 0  ✗ 不是2的幂
```

**判断方法：** `n > 0 and (n & (n-1)) == 0`

```python
def is_power_of_two(n):
    return n > 0 and (n & (n - 1)) == 0

# 测试
for n in [1, 2, 3, 4, 5, 8, 16, 32, 100, 128]:
    print(f"{n}: {'是' if is_power_of_two(n) else '不是'}2的幂")
```

**【身体锚点 #6：独生子女搜查令】**

> 动作：
> - 竖起1根食指 → "二进制里只有1个1，这是独生子女！"
> - 竖起多根手指 → "二进制里有好几个1，不是独生子女！"
>
> 具体步骤：
> 1. 听老师说一个数
> 2. 用手指表示这个数的二进制
> 3. 观察有几根手指竖着（有几个1）
> 4. 只有1根手指竖着 → "是2的幂！"
>
> 全班喊着口号："独生子女搜查令，只有1个1就是2的幂！"

**教师引导语：**
> "2的幂在二进制里就像'独生子女家庭'——家里只有一个'1宝宝'，其他全是'0宝宝'。
> n & (n-1) 就像'消灭一个宝宝'——如果消灭之后一个都不剩了，说明原来只有一个宝宝！
> 如果消灭之后还有剩的，说明原来有好几个宝宝——不是2的幂！"

**全班互动游戏：**
```
师：8（1000）！
生：（竖1根食指）"只有1个1！是2的幂！"

师：10（1010）！
生：（竖2根食指）"有两个1！不是2的幂！"

师：32（100000）！
生：（竖1根食指）"只有1个1！是2的幂！"

师：12（1100）！
生：（竖2根食指）"有两个1！不是2的幂！"
```

**【记忆钩子 #6：切蛋糕魔法】**

> 🎭 **比喻**：判断2的幂就像"切蛋糕魔术"。
> - 2的幂的二进制就像一个蛋糕上只有一颗樱桃（唯一的1）
> - n-1 就是切一刀——把樱桃和蛋糕分开
> - n & (n-1) 就是看"切完后还有没有樱桃"
>   - 结果为0 → 原来只有1颗樱桃 ✅
>   - 结果不为0 → 原来不止1颗樱桃 ❌
>
> 举例：数字8（1000）
> - 8-1=7（0111）— 切开了！
> - 1000 & 0111 = 0000
> - 樱桃不见了！原来只有1颗 → 8是2的幂！🎉

**课堂口诀：**
> "n减1和n与，结果等于0就是2的幂！
>  独生子女只有1个1，一把剪刀剪光光！"

---

### 第三段：演示（10分钟）——"Turtle位运算魔法秀"

**教师操作流程：**

#### 演示1：奇偶判断器
1. 运行 04_位运算实战.py
2. 输入不同的数字
3. 观察Turtle用颜色区分奇偶：
   - 奇数：背景显示暖色（橙色）
   - 偶数：背景显示冷色（蓝色）
4. 展示二进制最低位：奇数绿色（1），偶数红色（0）

**关键提问：**
```
老师："输入5，看二进制最低位是什么？"
学生："1！"
老师："判断结果是？"
学生："奇数！显示橙色！"
老师："输入6呢？"
学生："最低位是0，偶数！显示蓝色！"
```

#### 演示2：RGB颜色通道提取
1. 展示一个RGB颜色值
2. 用掩码提取R、G、B通道
3. 用不同颜色的色块展示提取结果
4. 修改某个通道的值，观察颜色变化

#### 演示3：位运算速度比拼
1. 用Turtle画两个进度条
2. 一个显示普通运算的速度
3. 一个显示位运算的速度
4. 直观对比谁更快

---

### 第四段：实操练习（15分钟）——"位运算实战家"

#### 练习1：奇偶判断器（5分钟）

**任务：编写一个程序，用位运算判断奇偶并画图**

```python
import turtle

t = turtle.Turtle()
t.speed(0)

def check_odd_even(n):
    """用位运算判断奇偶，并画对应的图形"""
    if n & 1:  # 奇数
        t.fillcolor("orange")
        t.begin_fill()
        t.circle(50)
        t.end_fill()
        t.penup()
        t.goto(0, -20)
        t.color("white")
        t.write(f"{n} 是奇数!", align="center", font=("Arial", 16, "bold"))
    else:  # 偶数
        t.fillcolor("skyblue")
        t.begin_fill()
        for _ in range(4):
            t.forward(80)
            t.left(90)
        t.end_fill()
        t.penup()
        t.goto(0, -10)
        t.color("white")
        t.write(f"{n} 是偶数!", align="center", font=("Arial", 16, "bold"))

# 测试
check_odd_even(5)  # 奇数 -> 画橙色圆
turtle.done()
```

**拓展：** 让程序循环运行，用户输入数字，程序判断奇偶并画图

#### 练习2：掩码提取RGB（5分钟）

**任务：用位运算从一个颜色值中提取RGB分量**

```python
# 给定一个颜色值（十六进制）
color = 0x66CCFF  # 天蓝色

# 用位运算提取RGB
R = (color >> 16) & 0xFF
G = (color >> 8) & 0xFF
B = color & 0xFF

print(f"颜色: #{hex(color)[2:].upper()}")
print(f"R={R} (红色分量)")
print(f"G={G} (绿色分量)")
print(f"B={B} (蓝色分量)")
```

**自己设计颜色：**
- 选择一个颜色，写出它的十六进制：#______
- 用位运算提取RGB：
  R = ______
  G = ______
  B = ______
- 用Python验证结果

#### 练习3：编程实践（5分钟）

**任务：写一个程序，实现以下功能**

```python
# 程序1：位运算工具箱
def show_bit_tricks(n):
    print(f"数字: {n} = {bin(n)}")
    print(f"判断奇偶: {'奇数' if n & 1 else '偶数'}")
    print(f"判断2的幂: {'是' if n > 0 and (n & (n-1)) == 0 else '不是'}")
    print(f"乘8: {n} << 3 = {n << 3}")
    print(f"除4: {n} >> 2 = {n >> 2}")
    print(f"取末4位: {n & 0b1111}")

# 程序2：交换测试
a, b = 10, 20
print(f"交换前: a={a}, b={b}")
a ^= b
b ^= a
a ^= b
print(f"交换后: a={a}, b={b}")
```

---

### 第五段：小测（5分钟）——"位运算实战大考验"

#### 第1关（判断题）

```
1. n & 1 可以判断n是奇数还是偶数。 (  )
2. (a ^ b) == 0 表示a和b不相等。 (  )
3. a ^= b; b ^= a; a ^= b 可以交换a和b的值。 (  )
4. n & (n-1) == 0 表示n是2的幂。 (  )
5. n << 3 等于 n * 8。 (  )
```

**答案：** 1.对  2.错(表示相等)  3.对  4.对(要加上n>0)  5.对

#### 第2关（选择题）

```
1. 用位运算判断奇偶，应该用哪个表达式？
  A. n & 0  B. n & 1  C. n | 1  D. n ^ 1

2. 十进制6是奇数还是偶数？
  A. 奇数  B. 偶数  C. 无法判断

3. 16是2的幂吗？
  A. 是  B. 不是

4. 掩码 (1 << 4) - 1 等于多少？
  A. 4  B. 15  C. 16  D. 31
```

**答案：** 1.B  2.B  3.A  4.B

#### 第3关（填空题）

```
1. 判断奇偶的位运算表达式：n ____ 1
2. 判断相等的位运算表达式：(a ____ b) == 0
3. 取n的最后4位的掩码：n & (____ - 1)
4. n * 16 用左移写成：n ____ 4
5. n // 8 用右移写成：n ____ 3
```

**答案：** 1.&  2.^  3.(1<<4)  4.<<  5.>>

---

## 板书设计

```
+-----------------------------------------------------------------+
|                 第18节：位运算实战                               |
+-----------------------------------------------------------------+
|                                                                   |
|  实战技巧                       口诀                              |
|  --------                       ----                             |
|  1. 判断奇偶: n & 1            "奇偶判断用与1"                  |
|  2. 判断相等: (a^b)==0         "异或相等得0"                    |
|  3. 交换数值: a^=b;b^=a;a^=b  "三步异或交换法"                 |
|  4. 掩码取末k位:               "掩码面具只露想看"               |
|     n & ((1<<k)-1)                                                |
|  5. 快速乘除: << 乘 >> 除      "左移乘右移除"                   |
|  6. 判断2的幂: n&(n-1)==0     "一刀砍掉最高位"                  |
|                                                                   |
|  实战应用: RGB颜色提取、快速计算                                 |
+-----------------------------------------------------------------+
```

---

## 教学准备

### 教师准备
- PPT课件（含实战技巧对比表、颜色提取示例）
- Python环境
- 代码文件 04_位运算实战.py
- 随堂练习纸（打印，每人1份）
- 课后练习纸（打印，每人1份）

### 学生准备
- 笔+草稿纸
- Python环境（实操环节用）

---

## 教学反思（课后填写）

| 项目 | 评价 | 改进建议 |
|------|------|----------|
| 导入环节趣味性 | 5星 | |
| 知识点讲解清晰度 | 5星 | |
| 演示环节直观性 | 5星 | |
| 实操环节完成度 | 5星 | |
| 小测环节反馈 | 5星 | |

---

## 延伸阅读与拓展

### 给学有余力的学生

1. **权限系统：** Linux文件权限用3位八进制（rwx），背后就是位运算
2. **网络掩码：** 子网掩码用位运算来判断IP地址是否在同一网段
3. **图形学：** 位图（bitmap）用每个bit表示一个像素
4. **压缩算法：** 很多压缩算法底层大量使用位运算

### 实战扩展

```python
# 1. 用位运算实现集合操作
A = 0b101010  # 表示集合 {1, 3, 5}
B = 0b110011  # 表示集合 {0, 1, 4, 5}
print(bin(A & B))  # 交集 -> 0b100010 = {1, 5}
print(bin(A | B))  # 并集 -> 0b111011
print(bin(A ^ B))  # 差集 -> 0b011001

# 2. 用位运算设置/清除标志位
flags = 0
flags |= 1 << 0  # 设置第0位
flags |= 1 << 2  # 设置第2位
flags &= ~(1 << 0)  # 清除第0位
print(bin(flags))  # 只有第2位是1
```

### 实际应用场景

- **游戏开发：** 碰撞检测、状态标志
- **嵌入式编程：** 控制硬件引脚的高低电平
- **数据压缩：** 把多个小数据打包到一个整数中
- **加密算法：** 异或是很多加密算法的基础操作

---

## 附录：实战口诀全集

### 奇偶判断
```
n & 1 n & 1，判断奇偶好简单
结果为1是奇数，结果为0是偶数
```

### 异或交换
```
三步异或交换法，不用第三变量
a变a异或b，b变b异或a，a变a异或b
完成后就交换了，神奇不神奇
```

### 掩码操作
```
(1<<k)-1是掩码，k个1排成行
n与掩码来相与，提取末k位真方便
RGB颜色各8位，右移掩码来提取
```

### 2的幂判断
```
n与(n-1)做与，结果为0是幂次
2的幂只有1个1，减1全变反码了
```

### 快速乘除
```
左移乘右移除，位运算速度超快
乘8用<<3，除4用>>2
遇到2的幂不用怕，左右移位算得快
```
