GESP 2024 3月12月 选择题详解

159 阅读11分钟

第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

知识点:

  • 字符串长度与数组长度的区别
  • C字符串的 strlen vs sizeof

第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()找不到字符时返回值是?”
  • 出填空题:如“从输入字符串中提取前三个字符”
  • 出改错题:考 cingetline 的混用问题

🔧 位运算符速查表(重点记这五个)

运算符名称作用举例(以 8 位为例)
&与 AND两位都为 1,结果才是 11100 & 1010 = 1000
``或 OR有一个为 1,结果就是 1
^异或 XOR两位不同为 1,相同为 01100 ^ 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 = 10
  • 5 >> 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