🧠 拓展记忆法:
“异或两次相同的数,一定恢复原样”,这是位运算中非常重要的基本规律,常用于算法中如“找只出现一次的数”。 位运算是 C/C++ 中一个高频、实用且在 GESP 等编程等级考试中必考的内容,尤其在 GESP 二级和三级中尤为重要。
🧠 一图记住常见 位运算符
| 运算符 | 名称 | 功能 | 示例(a=6, b=3) |
|---|---|---|---|
& | 按位与 | 两位都为1,结果才为1 | a & b = 2 |
| ` | ` | 按位或 | 有一个为1,结果为1 |
^ | 按位异或 | 相同为0,不同为1 | a ^ b = 5 |
~ | 按位取反 | 0变1,1变0(按补码处理) | ~a = -7 |
<< | 左移 | 所有位向左移n位 | a << 1 = 12 |
>> | 右移 | 所有位向右移n位(符号位保留) | a >> 1 = 3 |
✅ 各运算符详细说明:
1. & 按位与
cpp
复制编辑
6 & 3 → 0110 & 0011 = 0010 → 2
2. | 按位或
cpp
复制编辑
6 | 3 → 0110 | 0011 = 0111 → 7
3. ^ 按位异或
cpp
复制编辑
6 ^ 3 → 0110 ^ 0011 = 0101 → 5
特点:
x ^ x = 0x ^ 0 = xx ^ a ^ a = x(可还原)
4. ~ 按位取反(补码)
cpp
复制编辑
~6 = -7
补码取反后多为负数,和原码/补码概念相关(深入内容)
5. << 左移
cpp
复制编辑
6 << 1 = 12
相当于:乘以2的一次方
6. >> 右移
cpp
复制编辑
6 >> 1 = 3
相当于:除以2的一次方(向下取整)
📌 常见应用技巧:
| 应用 | 技巧 | 示例 |
|---|---|---|
| 判断奇偶 | x & 1 | 偶数为0,奇数为1 |
| 清零某些位 | x & mask | 把不需要的位清0 |
| 设置某些位为1 | `x | mask` |
| 取某一位值 | (x >> k) & 1 | 取第k位是否为1 |
| 异或找唯一值 | x ^ y | 用于找“只出现一次的数” |
🧪 GESP 风格例题
题1:
text
复制编辑
已知 int x = 6, y = 3; 则 x & y 的值为:
A. 0
B. 2
C. 3
D. 5
✅ 答案:B
题2:
text
复制编辑
若 x 是一个 int 类型变量,且 x 为奇数,则 x & 1 的值为:
A. 0
B. 1
C. x
D. 无法确定
✅ 答案:B
题3:
text
复制编辑
表达式: (x ^ 255) ^ 255 的结果为:
A. x
B. 0
C. 255
D. 无法确定
✅ 答案:A(异或两次同一个数可还原)
✅ 推荐练习方向:
- 二进制转换熟练(正负数补码表示)
- 熟练掌握按位运算逻辑
- 巩固左移/右移的实际含义
- 常见算法中的异或应用
🧪 GESP 三级位运算专项训练卷(共10题)
第1题:基本按位与
已知:
cpp
复制编辑
int a = 6, b = 3;
则 a & b 的值是:
A. 0
B. 2
C. 3
D. 5
✅ 正确答案:B
🧠 解析:
6 = 0110
3 = 0011
按位与:0110 & 0011 = 0010 → 2
第2题:异或还原
已知:
cpp
复制编辑
int x = 123;
执行 x = (x ^ 55) ^ 55; 后,x 的值为:
A. 0
B. 55
C. 123
D. 178
✅ 正确答案:C
🧠 解析:
异或两次相同的数可还原:x ^ a ^ a == x
第3题:判断奇偶
对于任意整数 x,x & 1 的结果为:
A. x 除以 2 的商
B. 0(偶数)或 1(奇数)
C. x 的最后两位
D. 永远是1
✅ 正确答案:B
🧠 解析:
最低位是1表示奇数,0表示偶数
第4题:按位或的结果
已知:
cpp
复制编辑
int a = 5, b = 10;
a | b 的值是:
A. 0
B. 15
C. 5
D. 10
✅ 正确答案:B
🧠 解析:
5 = 0101
10 = 1010
按位或:1111 → 15
第5题:按位取反
若 int a = 0;,则 ~a 的值是:
A. 0
B. -1
C. 1
D. 255
✅ 正确答案:B
🧠 解析:
取反是补码形式,~0 = -1(所有位都变成1)
第6题:左移运算
若 int a = 3;,则 a << 2 的值为:
A. 6
B. 8
C. 12
D. 1
✅ 正确答案:C
🧠 解析:
左移2位,相当于乘以2²:3 × 4 = 12
第7题:右移运算
若 int a = 20;,则 a >> 2 的值为:
A. 5
B. 10
C. 4
D. 0
✅ 正确答案:A
🧠 解析:
右移2位,相当于除以2²:20 / 4 = 5
第8题:清除最低3位
x & (~7) 的作用是:
A. 将 x 的最低3位全部设为1
B. 清除 x 的最低3位(变为0)
C. x 的高位清零
D. 保留 x 的最后一位
✅ 正确答案:B
🧠 解析:
7 = 00000111,~7 = 11111000,x & (~7) 会清除末3位
第9题:交换两个变量用异或
下面哪组语句可以不使用临时变量交换 a 和 b 的值?
A. a = b; b = a;
B. a = a + b; b = a - b; a = a - b;
C. a = a ^ b; b = a ^ b; a = a ^ b;
D. a = a & b; b = a | b; a = b ^ a;
✅ 正确答案:C
🧠 解析:
异或交换法经典套路,三次异或可交换两个整数
第10题:按位与清零判断
若:
cpp
复制编辑
int x = 0b10101100; // 172
x & 0b11110000 的结果是:
A. 0b00001100
B. 0b10100000
C. 0b00000000
D. 0b10101100
✅ 正确答案:B
🧠 解析:
按位与保留前四位,清除后四位 → 10100000(= 160)
✅ 成绩评估参考:
| 正确题数 | 建议 |
|---|---|
| 9-10 | 非常棒!可以尝试 GESP 四级内容了 |
| 7-8 | 掌握良好,建议多练习右移和掩码 |
| 5-6 | 建议集中复习“异或、左移右移”概念 |
| ≤4 | 需要系统学习位运算,可以我帮你规划课程 |