✅ 第1题:
10000011原=( )
10000011补=( )
解析:
-
8位原码表示中,最高位是符号位,
1表示负数,0000011= 3,所以原码 = -3。 -
补码:负数补码 = 原码按位取反 + 1:
- 原码:
10000011→ 反码:11111100→ 加1:11111101,即补码 =11111101,也是 -3 的补码。
- 原码:
答案:
- 原 = -3
- 补 = -3(
11111101)
涉及知识点:
- 原码、反码、补码之间的转换
- 二进制负数的补码表示方法
✅ 第4题(上半部分)
625.625 的二进制表示是( )
解析:
-
整数部分:625 ➝
1001110001 -
小数部分:
- 0.625 × 2 = 1.25 → 1
- 0.25 × 2 = 0.5 → 0
- 0.5 × 2 = 1.0 → 1
→ 小数部分 =.101
-
所以答案是:
1001110001.101
知识点:
- 十进制转二进制,包括整数和小数部分的转换方法
✅ 第4题(下半部分)
补码
11111101>> 1 后的结果是()
解析:
11111101是 -3 的补码(8位)。- 右移 1 位(算术右移):保留符号位,结果是
11111110,表示 -2(补码)。
答案:-2
知识点:
- 补码右移操作(算术右移 vs 逻辑右移)
- 位运算中负数的行为
✅ 第8题
a | 10(a 与 10 都是十进制,二进制表示最高位为1)运算的结果是()
解析:
- 假设 a=128(二进制
10000000) - 10 =
00001010 - 按位或:
10000000 | 00001010 = 10001010,即十进制 138
知识点:
- 位运算(按位或 |)
- 理解位的高位是否为1对结果的影响
✅ 第10题
cpp
复制编辑
char ch[] = "hello world";
size_t ret = strlen(ch);
cout << ret << endl;
解析:
-
strlen(ch)返回的是字符串长度,不包含\0。 -
"hello world" 长度是 11。
-
但
ch占用的内存空间是多少?- 有12个字符(包括末尾的
\0) - 每个
char占1字节
→ 答案是:12
- 有12个字符(包括末尾的
知识点:
- 字符串长度与数组长度的区别
- C字符串的
strlenvssizeof
✅ 第11题
cpp
复制编辑
int a=65;
cout<<tolower(a)<<endl;
解析:
a = 65→ 'A'tolower(65)→ 'a' → ASCII 97- 输出:97
知识点:
- ASCII码
- 字符大小写转换函数
tolower
✅ 第1题(另一份题):
整数 -5 的 16 位补码是( )
解析:
- 正数 5:0000 0000 0000 0101
- 取反:1111 1111 1111 1010
- 加一:1111 1111 1111 1011 → 即:
1111 1111 1111 1011
答案:1111111111111011
知识点:
- 十进制负数 → 补码(16位)
✅ 第2题
如果 -2 是
FFFE,那么 -4 的十六进制是?
分析:
- -2 的补码是:
1111111111111110=0xFFFE - -4 → 补码 =
1111111111111100=0xFFFC
答案:FFFC
知识点:
- 补码和十六进制的转换
✅ 第3题
cpp
复制编辑
cout << (3|16) << endl;
解析:
- 3 =
00000011 - 16 =
00010000 - 3 | 16 =
00010011= 19
答案:19
知识点:
- 位运算:按位或
|
✅ 第4题
cpp
复制编辑
int x = -5;
cout << (x == (x<<1>>1));
解析:
-
x = -5,x<<1 = -10,右移补符号位变成 -5?
-
实际上:
- x << 1 = -10
- -10 >> 1 = -5(符号右移)
→x == (x<<1>>1)为true
答案:1(true)
知识点:
- 左右移对负数补码的影响
- 算术右移(保留符号位)
✅ 第9题
cpp
复制编辑
string str = "gEsP is Interesting !";
int x = str.length(); // 22
int nwords = 0;
for(int i = 0; i < x; i++)
if(str[i]==' ') {
nwords++;
while(str[++i]==' ') ;
}
分析:
- 统计空格数,每个空格前是一个词。
- 句子中有3个空格,意味着 4 个词
- 所以 nwords = 3,表示有 3 个空格,但要 +1 表示 4 个词
答案:3
知识点:
- 字符串扫描、单词统计
- 避免多空格重复计数
✅ 第10题
C++ 字面量中哪个字符码值最大?
- A. 100(十进制)
- B. 075(八进制)
- C. 0x70(十六进制)
- D. 0x60
分析:
- A: 100(十进制)
- B: 八进制 075 = 十进制 61
- C: 0x70 = 十进制 112
- D: 0x60 = 十进制 96
→ 最大的是 C(0x70)
知识点:
- 各种进制表示法(八进制、十六进制、十进制)
- 比较不同进制下的数值大小
✅ 第11题
cpp
复制编辑
int a[20], i;
int cnt = 0;
for(i = 0; i < 20; i++) a[i] = i+1;
for( ; i > 1; i--)
if((a[i-1] + a[i-2]) % 3)
cnt++;
cout << cnt;
分析:
- i=20;a[19]=20
- 循环判断
(a[i-1]+a[i-2]) % 3 != 0时 cnt++ - 从 i=20 到 i=2 共 19 次
- 统计的是非3的倍数的和的次数,具体为多少可以运行得到:13
知识点:
- 对数组的逆序遍历
- 模运算和统计个数
✅ 第12题
cpp
复制编辑
char str[20] = {'G', 'E', 'S', 'P'};
分析:
- str 不是字符串(没有
\0) strlen(str)会出错(找不到结束符)- 但字符串长度是 0,因为不是合法字符串
答案:未定义/0(看上下文)
知识点:
- 字符数组和字符串的区别
\0截止符的重要性
✅ 判断题
int 类型变量 a,执行操作 (a << 2 >> 2) 后的值一定是 a。( )
分析:
- 对于正数是成立的
- 对于负数,右移保留符号位,可能发生变化
- 所以:不一定成立
答案:错
📌 总结学生薄弱知识点
| 知识点 | 弱点表现 | 建议 |
|---|---|---|
| 原码/补码/反码 | 多题错误 | 画图记忆+模拟补码计算 |
| 位运算( | 、<<、>>) | 多题错误 |
| 字符串处理 | strlen 与 sizeof 混淆 | 多做 char[] 与 string 的题 |
| 多进制(十、八、十六) | 十六进制和八进制不熟 | 编写转换函数进行练习 |
| 编码ASCII | 字符与整数的转换混乱 | 查 ASCII 表,练习 char 到 int |
| C++ 控制结构 | 对于双层循环、数组边界掌握不牢 | 建议逐步执行并打印变量 |
✅ GESP 常考函数/函数组总表(附分类与考点)
| 类别 | 函数名 | 功能 | 常见考点 |
|---|---|---|---|
| ✅ 字符处理 | isalpha(c) | 判断是否为英文字母 | 条件判断、字符分类统计 |
| ✅ 字符处理 | isdigit(c) | 判断是否为数字字符 | 判断输入是否是数字 |
| ✅ 字符处理 | islower(c) | 是否为小写字母 | 字母统计 |
| ✅ 字符处理 | isupper(c) | 是否为大写字母 | 与 toupper() 搭配 |
| ✅ 字符处理 | tolower(c) | 转换为小写 | 不区分大小写比较 |
| ✅ 字符处理 | toupper(c) | 转换为大写 | 见上 |
| ✅ 字符串处理 | strlen(str) | 返回字符串长度(不含 \0) | 计算长度,常和数组一起出题 |
| ✅ 字符串处理 | strcpy(dest, src) | 复制字符串 | 考替换、拷贝 |
| ✅ 字符串处理 | strcmp(s1, s2) | 比较两个字符串 | 判断相等、小于、大于 |
| ✅ 输入处理 | getline(cin, str) | 读取整行字符串 | 与 cin 混用考输入陷阱 |
| ✅ 输入处理 | cin.get() | 逐字符读入,包括空格换行 | 考“格式陷阱” |
| ✅ 排序/最大值 | sort(arr, arr+n) | 快速排序 | 排序题常见 |
| ✅ 算法类 | max_element(arr, arr+n) | 指向最大元素 | 数组中找最大值 |
| ✅ 数学类 | abs(x) | 取绝对值 | 差值、距离 |
| ✅ 数学类 | pow(a,b) | 计算 a 的 b 次幂 | 计算指数,往往配合 sqrt() |
| ✅ 数学类 | sqrt(x) | 平方根 | 几何/公式题常见 |
🎯 GESP 常考函数的使用场景举例
📌 1. 判断字符串是否全为字母
cpp
复制编辑
bool is_all_alpha(string s) {
for (char c : s)
if (!isalpha(c)) return false;
return true;
}
📌 2. 把一段文字全部转成小写
cpp
复制编辑
for (char &c : s)
c = tolower(c);
📌 3. 查找一组数中最大值
cpp
复制编辑
int a[100], n;
cin >> n;
for (int i = 0; i < n; ++i) cin >> a[i];
cout << *max_element(a, a + n);
📝 建议训练方式:
| 方法 | 描述 |
|---|---|
| 🧩 做选择判断题 | 类似“下列哪个函数能判断一个字符是否为数字?” |
| 🧠 模拟改错题 | “以下代码中哪个地方使用了错误的函数?” |
| ✍️ 编写小程序 | 如“输入字符串,输出所有大写字母数量” |
📌 1. str.find(char) / str.find(string)
-
作用:返回首次出现的位置(找不到返回
string::npos) -
常考点:
- 判断是否找到了字符(如
if (str.find('x') != string::npos)) - 找不到时返回的是一个非常大的数(
npos = -1转无符号)
- 判断是否找到了字符(如
📌 2. str.rfind(char)
- 作用:从右往左找,返回最后一次出现的位置
- 考点:和
find()区分,最后出现的位置而非第一次
📌 3. str.substr(pos, len)
- 作用:返回从
pos开始长度为len的子串 - 考点:字符串截取、提取关键词、模拟查找
cpp
复制编辑
string str = "abcdef";
str.substr(2, 3); // "cde"
📌 4. str.length() / str.size()
- 作用:返回字符串长度
- 考点:配合循环、位置判断
length()和size()完全等价,任选其一。
📌 5. str.compare(str2)
-
作用:比较字符串大小,结果为 int
- 返回 0:相等
- <0:左边小
-
0:左边大
-
考点:与
==、<结合,做排序/查重
cpp
复制编辑
if(str1.compare(str2) == 0) // 等价于 str1 == str2
📌 6. str.erase(pos, len)
- 作用:从字符串中删除从 pos 开始的 len 个字符
- 考点:修改字符串、模拟删除操作
cpp
复制编辑
str.erase(1, 2); // 删除第1位开始的两个字符
📌 7. str.insert(pos, "abc")
- 作用:在 pos 位置插入字符串
- 考点:模拟插入、字符串构造
📌 8. getline(cin, str)
- 作用:读取整行,包括空格
- 常考点:和
cin >>混用会丢失换行符,需要cin.ignore()配合 - 例题:输入一行中提取某段内容、单词
📌 9. to_string(int)
- 作用:把数字变成字符串
- 例子:拼接序号、生成命名等
cpp
复制编辑
string s = "ID_" + to_string(5); // "ID_5"
📌 10. stoi(str) / stol(str)
- 作用:把字符串变整数 / 长整数
- 例题:提取字符串中的数字,求和、判断大小等
📝 小结表:GESP 字符串函数速查表
| 函数 | 功能 | 常考点 |
|---|---|---|
find() | 查找首次出现位置 | 判断存在、位置偏移 |
rfind() | 查找最后一次 | 倒序找 |
substr() | 截取字符串 | 提取关键字段 |
length() / size() | 长度 | 判断越界、循环终止条件 |
compare() | 比较大小 | 判相等、排序 |
erase() | 删除字符 | 处理内容 |
insert() | 插入字符串 | 模拟文本修改 |
getline() | 读整行 | 读入句子或多单词 |
to_string() | 数字 → 字符串 | 拼接、转换 |
stoi() / stol() | 字符串 → 数字 | 转换再计算 |
🧠 建议练习方式
- 出选择题:如“
str.find()找不到字符时返回值是?” - 出填空题:如“从输入字符串中提取前三个字符”
- 出改错题:考
cin和getline的混用问题
🔧 位运算符速查表(重点记这五个)
| 运算符 | 名称 | 作用 | 举例(以 8 位为例) |
|---|---|---|---|
& | 与 AND | 两位都为 1,结果才是 1 | 1100 & 1010 = 1000 |
| ` | ` | 或 OR | 有一个为 1,结果就是 1 |
^ | 异或 XOR | 两位不同为 1,相同为 0 | 1100 ^ 1010 = 0110 |
~ | 取反 NOT | 每一位 0 变 1,1 变 0(对整数补码) | ~00001111 = 11110000 |
>> | 右移 | 所有位整体向右移动 | 1100 >> 1 = 0110(逻辑右移) |
<< | 左移 | 所有位整体向左移动 | 0011 << 1 = 0110 |
✅ 详细例子讲解
1️⃣ & 与运算(都为 1 才是 1)
cpp
复制编辑
0b1100 & 0b1010 = 0b1000
解释:
markdown
复制编辑
1100
1010
----
1000
2️⃣ | 或运算(有 1 就是 1)
cpp
复制编辑
0b1100 | 0b1010 = 0b1110
3️⃣ ^ 异或运算(不同为 1)
cpp
复制编辑
0b1100 ^ 0b1010 = 0b0110
4️⃣ ~ 按位取反(所有位 0→1,1→0)
cpp
复制编辑
~0b00001111 = 0b11110000 (注意它是补码)
在 C++ 中 ~ 作用在 int 上,是按补码取反的,结果可能是负数。
5️⃣ >> 和 << 移位
5 << 1就是 5 乘以 2:00000101 << 1 = 00001010 = 105 >> 1就是 5 除以 2:00000101 >> 1 = 00000010 = 2
对于负数右移,高位补 1(算术右移)
对于正数右移,高位补 0
🧠 小口诀记忆:
复制编辑
与 & 全 1 才 1,
或 | 有 1 就 1,
异或 ^ 不同得 1,
取反 ~ 翻脸不认,
左移 << 乘以 2,
右移 >> 除以 2。
🎯 示例题:GESP 同款风格
【选择题】
已知:
cpp
复制编辑
int x = 0b1101;
int y = 0b1011;
问:x & y 的值是?(十进制)
A. 15
B. 9
C. 11
D. 13
✅ 解:1101 & 1011 = 1001 = 9,答案是 B