GESPC++三级考试语法知识---位运算历年真题
🧙♂️ 第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) 变成 111110103、💡 关键知识
👉 在计算机中(补码):
~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、✨ 考试技巧
自己画表格:
| i | sum |
|---|---|
| 1 | 1 |
| 2 | 1(continue) |
| … | … |
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 // 等于 0 8 >> 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 = 1111 4 = 0100 ^ ↓ 1011 = 113、🧮 再算 最左边 &
a & b = 3 & 73 = 011 7 = 111 & ↓ 011 = 34、🧮 最后 算 |
3 | 11 = 115、🧠 知识点总结
^:不同为 1
&:都为 1 才是 1
|:有 1 就是 1括号最优先!
🧠 故事讲解:谁先上滑梯? 🛝
(1)优先级顺序:
乘除 > 加减 > 位运算(2)✏️ 小例子
3 + 4 & 1(3)先算:
3 + 4 = 7 7 & 1 = 1(4)🧠 知识点总结
📌 位运算优先级比算数运算符优先等级小
🧩 第9题:不用第三人,交换位置!
📜题目:哪个位运算可以交换两个变量?
👉答案:A
1、🌈故事
汉克老师遇到两个小精灵:
a = 5 b = 3他们吵架了:
“我想换位置,但不想找第三个人帮忙!”
2、🧠神奇魔法:异或 XOR
口诀:
相同为0,不同为13、✨交换步骤
a = a ^ b; b = a ^ b; a = a ^ b;4、🔍举例
a = 5 (101) b = 3 (011) a = a ^ b → 110 b = 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 = 110 5 = 1012、🧠规则
👉看2进制数字最后一位:
0 → 偶数
1 → 奇数
x & 13、🎯结论
👉成立 → ✅
🌟《奇偶校验大冒险》
🎯 一、故事背景
1、在“数据王国”里,所有信息都会变成二进制传输:
例如:数字 5 → 1012、👑国王布置了任务:
“数据在路上传输后要汇报一共有几个1,而且要知道是奇数个1还是偶数个”
🧠 二、规则讲解
1、📜规则
👉统计所有数字中:
二进制里“1”的总个数2、然后判断:
如果是奇数个1 → 输出校验码 = 1
如果是偶数个1 → 输出校验码 = 0
🌈 三、举个完整例子
1、🎯输入
3 5 3 22、🧩 第一步:变成二进制
| 数字 | 二进制 | 1的个数 |
|---|---|---|
| 5 | 101 | 2 |
| 3 | 11 | 2 |
| 2 | 10 | 1 |
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 → 最后一位是0 5 = 101 → 最后一位是1(2)🧩 x >>= 1 是什么?
👉右移一位(去掉最后一位)
101 → 10 → 1 → 0🎯 五、完整代码
#include <iostream> using namespace std; int main() { 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); // 看最后一位是不是1 x >>= 1; // 去掉最后一位 } } // 输出总数 和 校验码 cout << total << " " << (total % 2) << endl; return 0; }🎯 第10题:位运算魔法阵
1、🧠 代码
int a = 0b1101; int b = 0b1011; cout << (a ^ b);2、🎭 故事
👉 有两个灯阵:
a = 1101 b = 1011👉^是一种魔法:
👉不同亮 → 亮(1)
相同 → 灭(0)
3、✏️ 计算
1101 ^1011 ----- 01104、📌 结论
👉^是:
按位异或
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 → 二进制 0101 i = 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、✏️ 第五步:完整代码
#include <iostream> using namespace std; int main() { 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 & 3 3 = 0011 -------- 0001 //结果是1,正确 5 = 0101 //5 | 3 3 = 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的二进制为00100001 x=x&00001111; //00001111是8进制数,转换10进制为585 ,65与585&的结果还是:00100001 cout<<x<<endl; //输出 A2、 操作符 &
👉 & 的左右两侧要都是1才是1,有一个0 ,就是0。
🌟第5题:位运算 vs 逻辑运算
1、🎯故事
有两个魔法:
| 符号 | 含义 |
|---|---|
| & | 按位与 |
| | | 按位或 |
2、🧠重点
(23 | 10)👉 二进制:
23 = 10111 10 = 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 10003、✅ 正确答案:A、a的值变为1011 1000
🌟 第10题:按位与的秘密
1、🧙♂️故事:
有两个魔法:
result = a & b result2 = a2 & b22、第一部分:
a = 123 b = 1 result = 123 & 1👉 所以结果 =1
3、第二部分:
a2 = -123 b2 = -1(无符号)👉 -1 的二进制是:全1!
👉 所以:
任何数 & 全1 = 原数👉 result2 = -123
