#1695. GESP-C++三级(2026-09)

GESP-C++三级(2026-09)

CCF GESP C++ 三级 (2026 年 09 月)

一、单选题(每题 2 分,共 30 分)

1. 关于计算机的数据编码,下⾯说法不正确的是( )

{{ select(1) }}

  • 数字 5 ,不管采⽤原码、反码、补码,它的 8 位⼆进制形式都是 。
  • 计算机科学中,单位换算默认1KB=1024B ,⽽⾮1000B 。
  • 原码是最直观的⼀种有符号数表⽰⽅法。
  • 反码运算中,最⾼位进位要抛掉。

2. 关于进制转换,下⾯说法不正确的是( )

{{ select(2) }}

  • A. 数字 1101B 可以分解为:

    $$1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 = 8 + 4 + 0 + 1 = 13 \text{(十进制)} $$
  • B. 数字 42Q 可以分解为:

    $$4 \times 8^1 + 2 \times 8^0 = 32 + 2 = 34 \text{(十进制)} $$
  • C. 数字 2BEH 可以分解为:

    $$2 \times 16^2 + 11(\text{B}) \times 16^1 + 14(\text{E}) \times 16^0 = 512 + 176 + 14 = 702 \text{(十进制)} $$
  • D. 345Q = 0E3H (通常写作 E3H)

3. 下⾯程序的运⾏结果是( )

#include <iostream>
using namespace std;
int main() {
    int x = 1;
    for (int i = 0; i = 0; i <= 5) {
        x++;
    }
    cout << x << endl;
    return 0;
}

{{ select(3) }}

  • 1
  • 10
  • 15
  • 程序编译错误

4. 关于计算机编码中补码,下⾯说法错误的是( )

{{ select(4) }}

  • 正数的补码:与其原码、反码相同。
  • 负数的补码:将其对应的正数的原码按位取反(得到反码),然后加 1。
  • 8 位的补码,最⼤表⽰数据是 128,最⼩表⽰数据是-128 。
  • 负数的补码,从右往左扫描正数的⼆进制形式,遇到第⼀个1 之后,左边的所有位都取反。

5. 下⾯程序执⾏的结果是( )

#include <iostream>
using namespace std;
int main() {
    int x = 2026;
    int count = 0;
    while (x > 0) {
        count++;
        x = x & (x - 1);
    }
    cout << count << endl;
}

{{ select(5) }}

  • 2026
  • 8
  • 16
  • 32

6. 关于位运算,下列说法错误的是( )

{{ select(6) }}

  • 找唯⼀数:数组中唯⼀出现⼀次的数,其余出现两次,全部异或结果即为该数。例子:数组 [5, 7, 9, 7, 5] (唯一数是 9 )
  • 若左移导致⾼位溢出(如超过整型范围),结果不再符合乘法规律。
  • 有符号整数左移溢出时结果确定。
  • n+2n+2 位二进制数 A1A2An00A_1A_2\cdots A_n00,一定是 4 的倍数(最后两位 00 是二进制的 00)。

7. 计算 3 & 7 | 15 ^ ~11 ( a=3, b=7, c=15, d=11 ):( )

{{ select(7) }}

  • -9
  • -1
  • -7
  • -5

8. 下⾯函数是⼀个加密解密的函数,横线处应该填⼊的程序段是( ) A. B. C. D.

#include <iostream>
#include <string>
using namespace std;
int main() {
    int key;
    cin >> key;
    string msg = "Hello GESP";
    cout << msg << endl;
    for (int i = 0; i < msg.size(); i++) {
        msg[i] = msg[i] ^ key;
    }
    cout << msg << endl;
    _________________________________
    cout << msg << endl;
    return 0;
}
}

A.

for (int i = 0; i < msg.size(); i++) {
    msg[i] = msg[i] | key;
}

B.

for (int i = 0; i < msg.size(); i++) {
    msg[i] = msg[i] >> key;
}

C.

for (int i = 0; i < msg.size(); i++) {
    msg[i] = msg[i] ^ key;
}

D.

for (int i = 0; i < msg.size(); i++) {
    msg[i] = msg[i] & key;
}

{{ select(8) }}

  • A
  • B
  • C
  • D

9. 下列程序是分别判断输⼊的 N 个数是否可能是⼆进制、⼋进制、⼗进制、⼗六进制,横线处应该填⼊的是 ( )

#include <iostream>
using namespace std;
int main() {
    int n = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
    char str[11];
    cin >> str;
    char max = '0';
    for (int i = 0; str[i] != '\0'; i++)
        if (str[i] > max)
            max = str[i];
        _____________________________
    }
    return 0;
}
/ 10

{{ select(9) }}

  • cout << (max <= '1') << " " << (max <= '7') << " " << (max <= '9') << " " << (max <='F')<<endl;
  • cout << (max <= 1) << " " << (max <= 7) << " " << (max <= 9) << " " << (max <= 'F') <<endl;
  • cout << (max <= 1) << " " << (max <= 7) << " " << (max <= 9) << " " << (max <= F) <<endl;
  • cout << (max >= 1) << " " << (max >= 7) << " " << (max >= 9) << " " << (max >= F) <<endl;

10. 下⾯的程序是位掩码技术实现权限的组合管理。⾸先定义四个权限常量,分别对应读、写、修改、删除, 每个权限占⽤整数的⼀个独⽴⼆进制位。初始化权限掩码 mask 为 0 ,代表没有任何权限。如果想实现如下的操 作:添加读权限;添加写权限;清除读权限,其他位不变;添加删除权限。则横线处应该填⼊的是( )。 3 A. B. C. D.

#include <iostream>
using namespace std;
int main() {
    const int READ = 1 << 0;
    const int WRITE = 1 << 1;
    const int MODIFY = 1 << 2;
    const int DELETE_ = 1 << 3;
    int mask = 0;
    __________________________
    return 0;
}

A.

mask = mask | READ;
mask = mask | WRITE;
mask = mask & (~READ);
mask = mask | DELETE_;

B.

mask = mask | READ;
mask = mask | WRITE;
mask = mask & (~READ);
mask = mask | DELETE_;

C.

mask = mask | READ;
mask = mask | WRITE;
mask = mask & (~READ);
mask = mask | DELETE_;

D.

mask = mask | READ;
mask = mask | WRITE;
mask = mask & (~READ);
mask = mask | DELETE_;

{{ select(10) }}

  • A
  • B
  • C
  • D

11. 下⾯选项中提到的变量都是正整数,关于位运算,下⾯说法错误的是( )

{{ select(11) }}

  • num >> 1 ,对于正整数,等价于对 num 做整数除以 ,向下取整
  • num | 0x0F ,可以把 num 的低 4 位全部置为 1 ,⾼位保持不变
  • num ^ num 的结果⼀定等于 0
  • 若 num 右移时低位被移出丢弃,结果⼀定符合除法数学规律

12. 已知: a=0, b=2, c=11, d=7, e=5 ,表达式 !a & b << c ^ d | e 的结果是( )

{{ select(12) }}

  • 5
  • 13
  • 7
  • 28

13. 关于 string 的成员函数,下⾯说法错误的是( )

{{ select(13) }}

  • size() 返回字符串的字符个数,不包含末尾的 '\0' ; length() 和 size() 功能完全等价
  • s.empty() :字符串为空时返回 true ,字符串不为空返回 false
  • s.substr(pos, len) ,当省略第⼆个参数 len 时,代表从 pos 位置⼀直截取到字符串末尾
  • s.erase(2) 表⽰删除字符串中下标为 2 的这⼀个字符

14. 以下数组定义,符合 C++ 语法的是( )

{{ select(14) }}

  • int a[] = {1, 2, 3.0};
  • int b['A'];
  • int c[ ];
  • float d[10.0];

15. 三进制有个奇妙的应⽤,有 1000 个酒缸,恰好 1 缸有毒。毒酒喝下后 24 ⼩时毒发死亡;⽆毒酒⽆影响 总共有 48 ⼩时,可以做两轮实验,每轮可以重新安排⽼⿏喝酒。有三种情况,这只⽼⿏两轮都不喝这缸酒;这只⽼ ⿏第⼀轮喝这缸酒;这只⽼⿏第⼆轮喝这缸酒,要保证找出毒酒,最少需要多少只⽼⿏?( )

{{ select(15) }}

  • 5
  • 7
  • 10
  • 9

二、判断题(每题 2 分,共 20 分)

1. 对于计算机编码运算,补码做加法运算时,如果最⾼位产⽣进位,需要把该进位循环加到结果的最低位

{{ select(16) }}

2. 求-13 的补码,可以对正数 的⼆进制,从右向左扫描,遇到第⼀个1之后,右边所有位全部取反,左边 保持不变。

{{ select(17) }}

3. ⼀个 8 位⼆进制原码表⽰的有符号数,可表⽰的数值范围是 -128到 +127

{{ select(18) }}

4. 这段代码执⾏后,能够将数组中所有⼤于 0 的元素赋值为 0

int a[] = {2, -5, 7, 0, -1};
int n = sizeof(a) / sizeof(a[0]);
for (int num : a) {
    if (num > 0) {
        num = 0;
}
}

{{ select(19) }}

5. a 是 int 有符号整型,若 (a & 1) == 1 结果为 true ,则 a ⼀定是正奇数

{{ select(20) }}

6. char str[4] = "GESP"; 将在内存空间中给 str[4] 分配 5 个字节

{{ select(21) }}

7. 判断字符串中字符是否是 '0' 或者 '1' ,可以写条件: if(str[i]==0 || str[i]==1)

{{ select(22) }}

8. 下⾯程序执⾏后,将输出 98

#include <iostream>
using namespace std;
int main() {
    int a = 'a', b = 'b';
    if (a > 0 || b++ > 0) {
    }
    cout << b;
}

{{ select(23) }}

9. 枚举可以在保证不漏解的前提下缩⼩枚举范围,不是必须遍历全部

{{ select(24) }}

10. 下⾯流程图逻辑:初始化 , ;当 成⽴时,执⾏ ,再执⾏ ; 循环结束输出 sum 。该流程图可以正确计算⼀维数组 a[0] ∼ a[n] 全部元素的总和。

{{ select(25) }}