GESPC++三级考试语法知识---位运算历年真题
- 2026-11-12 06:01:17



🧙♂️ 第2题:交换魔法阵
1、📖 题目:
程序让 a 和 b 发生了什么?
2、🎬 故事
小明学会了一个“交换魔法”:
a = a ^ b;b = a ^ b;a = a ^ b;
✨ 这是“无影交换术”(不用第三个变量)
3、💡 原理
异或的特点:
x ^ y ^ y = x
4、🎯 结果
👉 a 和 b 成功交换!
5、✅ 答案
👉 B. 互换
6、🧪 小例子
a = 3, b = 5;// 交换后:a=5, b=3

🧙♂️ 第8题:左移魔法
1、📖 题目:
00001111 左移3位
2、🎬 故事
(1)左移就像“整体向左搬家”,右边补0:
00001111 << 3(2)👉 变成:
011110003、🧮 转十进制
64 + 32 + 16 + 8 = 1204、✅ 答案
👉 D. 120
5、快速算法:
0x0F = 15
15<<3 = 15*8 =120

🌟 第9题:取反魔法(~ 的秘密)
1、📖 题目:哪个说法是错误的?
2、🎬 故事:黑白翻转魔法镜
(1)有一面神奇镜子 ~:
👉 0 变 1 👉 1 变 0
(2)就像:
00000101(5)变成11111010
3、💡 关键知识
👉 在计算机中(补码):
~x = -(x + 1)4、🧪 一个个验证
(1)✅ A:~5 = -6 ✔
~5 = -(5+1) = -6(2)❌ B:~0 = 0 ❌(错!)
~0 = -1👉 因为:
00000000 → 11111111 → -13)✅ C:~(-3) = 2 ✔
(4)✅ D:~8 = -9 ✔
5、✅ 答案
👉 B(错误)

🌟 第10题:位运算判断 🔍
1、📖 题目:
(a & 3 & 1) == 0 ?已知:a 最低位是 0
2、🎬 故事
二进制:
a: ?????03、💡 分析
a & 1 → 看最后一位👉 最后一位是0 → 结果0
4、🧮 整体
(a & 3 & 1) == 0 //正确5、✅ 结论
👉 正确


🌟 第 3 题:神秘的 sum 宝箱 🎁
1、📘 题目 一段代码运行后,sum 的值是多少?
正确答案:D:40
2、🧮 思路讲解
这类 题是典型的:
“for 循环 + 累加器”
只要记住一句话:
📌 每循环一次,就往 sum 里加点东西
3、✨ 考试技巧 自己画表格:
4、 8 >> 2 : 等于 8 / 4 = 2
i % 3 == 8 >> 2 : i % 3 == 2
等差数列求和公式:(1+10)*10 / 2 = 55
continue的数组和:2 + 5 + 8 = 15
最终结果: 55 - 15 =40
5、🧠 知识点总结
👉 for 循环(注意continue的条件) 👉 累加变量(sum += i)


🌟 第 4 题:位运算小陷阱 🪤
(1)📘 题目
下面程序输出什么?
正确答案:B:5
(2)🔍 关键知识点
这道题就考“位移运算”
3 >> 2 // 等于 08 >> 3 // 等于 1
(3)🧠 故事讲解
想象数字在传送带上:
>>表示 向右挪挪一次,相当于 除以 2
(4)🧮 代码分析
int x = 5;if (x == 3 >> 2) // 3>>2 = 0
❌ 5 ≠ 0,所以 if 不成立 ➡️ x 没变 ➡️ 输出 5
(5)🧠 知识点总结
👉 >> 位运算 👉 3级考试必考!

🌟 第 5 题:字符串 长度大冒险 📏
(1)📘 题目
string s = "C++ Programming";s.length() 是多少?
是15
(2) 🧮 数一数
C(1) +(2) +(3) 空格(4)P(5) r6 o7 g8 r9 a10 m11 m12 i13 n14 g15
(3) 🧮 算一算:
15|3 // 1111 | 0011 = 1111 十进制:15(4) 答案: B 、 15

✅ 正确答案:A:十进制 11
1、🧠 故事:位运算混合计算
遇到这问题。我们一步一步来,不要乱!
2、🧮 先算括号()内
c ^ d = 15 ^ 415 = 11114 = 0100^ ↓1011 = 11
3、🧮 再算 最左边 &
a & b = 3 & 73 = 0117 = 111& ↓011 = 3
4、🧮 最后 算 |
3 | 11 = 115、🧠 知识点总结
^:不同为 1
&:都为 1 才是 1
|:有 1 就是 1括号最优先!

🧠 故事讲解:谁先上滑梯? 🛝
(1)优先级顺序:
乘除 > 加减 > 位运算(2)✏️ 小例子
3 + 4 & 1(3)先算:
3 + 4 = 77 & 1 = 1
(4)🧠 知识点总结
📌 位运算优先级比算数运算符优先等级小


🧩 第9题:不用第三人,交换位置!
📜题目:哪个位运算可以交换两个变量? 👉答案:A
1、🌈故事
汉克老师遇到两个小精灵:
a = 5b = 3
他们吵架了:
“我想换位置,但不想找第三个人帮忙!”
2、🧠神奇魔法:异或 XOR
口诀:
相同为0,不同为13、✨交换步骤
a = a ^ b;b = a ^ b;a = a ^ b;
4、🔍举例
a = 5 (101)b = 3 (011)a = a ^ b → 110b = a ^ b → 101(变成5)a = a ^ b → 011(变成3)
🎉成功交换!
🎯结论
👉答案:A

🧩 第3题:浮点数右移?
📜题目: (x >> 1) 等价于 x/2(x是浮点数)
👉答案:❌ 错
1、🌈故事
汉克老师课堂演示:
double x = 3.5;x >> 1;
结果💥 编译器直接爆炸!
2、🧠原因
👉 >> 只能用于 整数
3、🎯结论
👉浮点数不能位运算 → ❌

🧩 第6关:判断奇偶的秘诀
📜题目: (x & 1) == 0 判断偶数
👉答案:✅ 对
1、🌈故事
汉克老师将10进制数字转成2进制数字:
6 = 1105 = 101
2、🧠规则
👉看2进制数字最后一位:
0 → 偶数
1 → 奇数
x & 13、🎯结论
👉成立 → ✅


🌟《奇偶校验大冒险》
🎯 一、故事背景
1、在“数据王国”里,所有信息都会变成二进制传输:
例如:数字 5 → 1012、👑国王布置了任务:
“数据在路上传输后要汇报一共有几个1,而且要知道是奇数个1还是偶数个”
🧠 二、规则讲解
1、📜规则
👉统计所有数字中:
二进制里“1”的总个数2、然后判断:
如果是 奇数个1 → 输出校验码 = 1
如果是 偶数个1 → 输出校验码 = 0
🌈 三、举个完整例子
1、🎯输入
35 3 2
2、🧩 第一步:变成二进制
3、🧩 第二步:统计总数
2 + 2 + 1 = 54、🧩 第三步:判断奇偶
5 是奇数 → 输出校验码 = 15、🎯输出
5 1🧠 四、核心算法
1、我们要做三件事:
🥇步骤1:读入数据
cin >> n;🥈步骤2:一个一个处理数字
for(int i = 0; i < n; i++)🥉步骤3:数每个数字里的“1”
👉关键技巧来了!
while(x > 0){count += (x & 1);x >>= 1;}
2、🌟重点解释!
(1)🧩 (x & 1) 是什么?
👉取最后一位!
6 = 110 → 最后一位是05 = 101 → 最后一位是1
(2)🧩 x >>= 1 是什么?
👉右移一位(去掉最后一位)
101 → 10 → 1 → 0🎯 五、完整代码
#includeusing namespace std;intmain(){int n;cin >> n;int total = 0; // 记录所有1的数量for(int i = 0; i < n; i++){int x;cin >> x;// 统计x中1的个数while(x > 0){total += (x & 1); // 看最后一位是不是1x >>= 1; // 去掉最后一位}}// 输出总数 和 校验码cout << total << " " << (total % 2) << endl;return 0;}


🎯 第10题:位运算魔法阵
1、🧠 代码
int a = 0b1101;int b = 0b1011;cout << (a ^ b);
2、🎭 故事
👉 有两个灯阵:
a = 1101b = 1011
👉 ^ 是一种魔法:
👉 不同亮 → 亮(1) 相同 → 灭(0)
3、✏️ 计算
1101^1011-----0110
4、📌 结论
👉 ^ 是:
按位异或
5、🎉 答案:D


一、🧙♂️ 故事背景:魔法数字锁
小A来到了一个神秘宝箱前 🧰 宝箱上写着一行奇怪的咒语:
(x & i) + (x | i) == 2025👉 只有找到最小的正整数 i 👉 才能打开宝箱!
二、🎯 任务目标
👉 输入一个数字 x 👉 找到最小的正整数 i,让:
(x & i) + (x | i) == 2025成立!
👉 如果找不到,就输出 -1
三、算法分析:
1、🧠 第一步:认识两个魔法
(1)✨ 魔法1:&(按位与)
👉 规则:
1 & 1 = 1其他情况 = 0
👉 就像:
👉 “两个人都同意,才亮灯💡”
(2)✨ 魔法2:|(按位或)
👉 规则:
有1就等于1👉 就像:
👉 “只要有一个人同意,就亮灯💡”
2、🎭 第二步:进一步理解
假设:
x = 5 → 二进制 0101i = 3 → 二进制 0011
✏️ 计算
① 按位与
0101&0011-----0001 → 1
② 按位或
0101|0011-----0111 → 7
③ 相加
1 + 7 = 8👉 如果等于2025,就成功!
3、🧠 第三步:怎么找 i?
(1)🎯 关键思路
👉 i 是未知的 👉 我们可以使用枚举法:一个一个试!
(2)🎭 故事
我们像一个小侦探 🕵️♂️
👉 从 i = 1 开始试:
试 1 ❌试 2 ❌试 3 ❌……直到找到!
4、🧠 第四步:范围是多少?
我们可以:
for (int i = 1; i <= 2025; i++)👉 为什么?
👉 因为要的结果是 2025,x | i 的结果是大于等于i,所以,最大搜索到2025足够了。 👉 超过就没必要了!
5、✏️ 第五步:完整代码
#includeusing namespace std;intmain(){int x;cin >> x;for(int i = 1; i <= 2025; i++){if((x & i) + (x | i) == 2025){cout << i << endl;return 0; // 找到就结束}}cout << -1 << endl; // 没找到return 0;}
四、🎉 最终总结
👉 这题本质就是:
枚举 + 位运算
🌟 第5题:逻辑运算大战
🎯 正确答案:D
1、🧠 故事
数字们在打架:
5 && 3 // 两侧都是真,结果为真 1 不是0 错误5 || 3 // 至少一侧是真,结果为真 1 不是11 错误
2、二进制:
5 = 0101 //5 & 33 = 0011--------0001 //结果是1,正确5 = 0101 //5 | 33 = 0011--------0111 //结果是7不是8,错误
3、只有 D 正确 ✔️

🌟 第6题:右移魔法(补码)
🎯 正确答案:B(-2)
1、🧠 故事
(1)一个负数:
11111101(补码)👉 右移1位(>>1)
(2)规则: 👉 符号位补1(因为是负数)
(3)结果:
111111104)👉 转回十进制 = -2
2、🎉 选 B

🌟 第8题:按位或(|)的魔法
🎯 正确答案:A
1、🧠 故事
(1)魔法:
a | 10(2)👉 10(二进制) = 1010
作用: 👉 把 第2位(从右往左)变成1
👉 把 第4位(从右往左)变成1
(3)所以: 👉 强制“第二位 = 1”,是正确的。
2、🎉 选 A

🌟 第5题:字符的输出
🎯 答案:✅️ 正确
1、🧠 看程序
char x=65; //x的二进制为00100001x=x&00001111; //00001111是8进制数,转换10进制为585 ,65与585&的结果还是:00100001cout<
2、 操作符 &
👉 & 的左右两侧要都是1才是1,有一个0 ,就是0。


🌟第5题:位运算 vs 逻辑运算
1、🎯故事
有两个魔法:
2、🧠重点
(23 | 10)👉 二进制:
23 = 1011110 = 01010
👉 按位或:
11111 = 313、🎯答案 C
👉 ✅ (23 | 10) == 31

🌟第6题:位运算大考验
1、🎯故事
右移运算:
2 >> 2👉 相当于:
2 / 4 = 02、🧠对比
1 >> 1 = 0👉 所以:
(2 >> 2) == (1 >> 1)3、🎯答案
B. (2>>2)和(1>>1)的值是一样的

🌟第7题:神秘交换术✨
1、🎯故事
有一个“无中间变量交换术”:
a ^= b;b ^= a;a ^= b;
2、🧠作用
👉 交换 a 和 b
3、🎯结论
👉 ✅ 实现变量交换
3、🎯答案
C. a和b的值交换


🌟第8题:控制最低位
1、🎯故事
有个魔法
a & ~12、🧠分析
1 = 0001~1 = 1110
👉 所以:
a & 11103、🎯效果
👉 把最后一位变成 0!
4、🎯答案 C
👉 ✅ 使最低位为0

🌟 第9题:左移魔法(位运算)
1、🧙♂️故事:
(1)小法师拿到一个二进制宝石:
a = 1010 11102)国王说:“把它左移2位!”
👉 左移规则(重点!!):
左边的位丢掉 ❌
右边补0 ✅
2、🎯 操作过程:
原来:1010 1110左移2:1011 1000
3、✅ 正确答案:A、a的值变为1011 1000

🌟 第10题:按位与的秘密
1、🧙♂️故事:
有两个魔法:
result = a & bresult2 = a2 & b2
2、第一部分:
a = 123b = 1result = 123 & 1
👉 所以结果 = 1
3、第二部分:
a2 = -123b2 = -1(无符号)
👉 -1 的二进制是:全1!
👉 所以:
任何数 & 全1 = 原数👉 result2 = -123
