GESP 客观题评测系统

试卷解析 · 理解每一步

2026-09-Level-3

2026-09-Level-3

试卷解析总览,可直接查看每题答案与解析。

单选题

第 1 题(单选题,2 分)

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

A.
数字 55,不管采用原码、反码、补码,它的 88 位二进制形式都是 (0000 0101)2(0000\ 0101)_2。
B.
计算机科学中,单位换算默认 1KB=1024B1\mathrm{KB}=1024\mathrm{B},而非 1000B1000\mathrm{B}。
C.
原码是最直观的一种有符号数表示方法。
D.
反码运算中,最高位进位要抛掉。

正确答案D

解析详情
答案 D原码、反码与补码
思路与推导
  1. 反码加法出现最高位进位时,要把进位加回最低位,称为循环进位;直接丢弃进位的是固定字长补码加法的处理,因此D错误。

第 2 题(单选题,2 分)

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

A.
数字 1101B1101\mathrm{B} 可以分解为:1×23+1×22+0×21+1×20=8+4+0+1=131\times2^3+1\times2^2+0\times2^1+1\times2^0=8+4+0+1=13(十进制)
B.
数字 42Q42\mathrm{Q} 可以分解为:4×81+2×80=32+2=344\times8^1+2\times8^0=32+2=34(十进制)
C.
数字 2BEH2\mathrm{BEH} 可以分解为:2×162+11(B)×161+14(E)×160=512+176+14=7022\times16^2+11(\mathrm{B})\times16^1+14(\mathrm{E})\times16^0=512+176+14=702(十进制)
D.
345Q=0E3H345\mathrm{Q}=0\mathrm{E3H}(通常写作 E3H\mathrm{E3H})

正确答案D

解析详情
答案 D按位权展开与进制转换
思路与推导
  1. 八进制345等于3×64+4×8+5=229,十六进制应为E5;E3等于227,因此D的等式错误。二进制1101等于13,八进制42等于34,十六进制2BE等于702。

第 3 题(单选题,2 分)

下面程序的运行结果是( )

#include <iostream>
using namespace std;
int main() {
    int x = 1;
    for (int i = 0; i = 0; i <= 5) {
        x++;
    }
    cout << x << endl;
    return 0;
}
A.
1
B.
10
C.
15
D.
程序编译错误

正确答案A

解析详情
答案 Afor循环条件与赋值
思路与推导
  1. for的第二项是i=0,执行赋值后的表达式值为0,条件为假,循环体一次也不执行。x保持1,输出1;这段语法可以编译。

第 4 题(单选题,2 分)

关于计算机编码中补码,下面说法错误的是( )。

A.
正数的补码:与其原码、反码相同。
B.
负数的补码:将其对应的正数的原码按位取反(得到反码),然后加 1。
C.
8 位的补码,最大表示数据是 128,最小表示数据是 −128。
D.
负数的补码,从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取反。

正确答案C

解析详情
答案 C补码表示范围
思路与推导
  1. 8位有符号补码的范围是−128至127,C将最大值写成128,因此错误。最高位参与符号及负权值表示,不能再用来表示正的128。

第 5 题(单选题,2 分)

下面程序执行的结果是( )。

#include <iostream>
using namespace std;
int main() {
    int x = 2026;
    int count = 0;
    while (x > 0) {
        count++;
        x = x & (x - 1);
    }
    cout << count << endl;
}
A.
2026
B.
8
C.
16
D.
32

正确答案B

解析详情
答案 B消去最低位的1
思路与推导
  1. x & (x-1)每次清除二进制中最低位的一个1。2026的二进制为11111101010,共8个1,所以循环8次,输出8。

第 6 题(单选题,2 分)

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

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

正确答案C

解析详情
答案 C位运算与有符号移位
思路与推导
  1. C错误:在本题采用的C++14语境下,有符号左移不满足标准规定的取值条件时可能产生未定义行为,不能保证结果确定。异或能抵消成对相同数;末尾两个二进制0表示能被4整除。

第 7 题(单选题,2 分)

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

A.
-9
B.
-1
C.
-7
D.
-5

正确答案D

解析详情
答案 D位运算优先级
思路与推导
  1. 先算~11,再按&、^、|的顺序结合。通常补码表示下~11=-12,3&7=3,15^(-12)=-5,最后3|(-5)=-5,因此选D。

第 8 题(单选题,2 分)

下面函数是一个加密解密的函数,横线处应该填入的程序段是( )。

#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;
}

正确答案C

解析详情
答案 C异或的可逆性
思路与推导
  1. 同一个值连续异或相同的key两次,结果恢复原值,即(x^key)^key=x。选项C再次逐字符异或key,能够恢复原字符串。

第 9 题(单选题,2 分)

下列程序是分别判断输入的 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;
}
A.
cout << (max <= '1') << " " << (max <= '7') << " " << (max <= '9') << " " << (max <= 'F') << endl;
B.
cout << (max <= 1) << " " << (max <= 7) << " " << (max <= 9) << " " << (max <= 'F') << endl;
C.
cout << (max <= 1) << " " << (max <= 7) << " " << (max <= 9) << " " << (max <= F) << endl;
D.
cout << (max >= 1) << " " << (max >= 7) << " " << (max >= 9) << " " << (max >= F) << endl;

正确答案A

解析详情
答案 A字符比较与进制数码
思路与推导
  1. 在题设使用合法数码字符的语境下,最大字符不超过'1'、'7'、'9'、'F',分别对应四种进制的上界,因此选A。max是字符,必须与带单引号的字符常量比较。

第 10 题(单选题,2 分)

下面的程序是位掩码技术实现权限的组合管理。首先定义四个权限常量,分别对应读、写、修改、删除,每个权限占用整数的一个独立二进制位。初始化权限掩码 mask 为 0 ,代表没有任何权限。如果想实现如下的操作:添加读权限;添加写权限;清除读权限,其他位不变;添加删除权限。则横线处应该填入的是( )。

#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_;

正确答案A

解析详情
答案 A权限位的设置与清除
思路与推导
  1. 用按位或添加权限,用mask & ~READ清除读权限并保留其他位。A使mask依次为1、3、2、10,最后保留写和删除权限。

第 11 题(单选题,2 分)

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

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

正确答案D

解析详情
答案 D右移与整数除法
思路与推导
  1. 对正整数右移一位等于除以2后向下取整;若低位1被丢弃,例如3>>1为1,而数学上的3÷2为1.5,所以D所说一定符合精确除法不成立。

第 12 题(单选题,2 分)

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

A.
5
B.
13
C.
7
D.
28

正确答案C

解析详情
答案 C运算符优先级
思路与推导
  1. 表达式按((!a)&(b<<c))^d|e计算。!0=1,2<<11=4096,1&4096=0,0^7=7,7|5=7,因此选C。

第 13 题(单选题,2 分)

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

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

正确答案D

解析详情
答案 Dstring删除函数
思路与推导
  1. s.erase(2)会删除从下标2到字符串末尾的全部字符;若只删除下标2这一个字符,应使用s.erase(2,1),所以D错误。

第 14 题(单选题,2 分)

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

A.
int a[] = {1, 2, 3.0};
B.
int b['A'];
C.
int c[ ];
D.
float d[10.0];

正确答案B

解析详情
答案 B数组长度与列表初始化
思路与推导
  1. 'A'是整型常量表达式,可以作为数组长度,因此B合法。A把double值3.0放入int列表初始化,属于被禁止的窄化转换;C没有长度也没有初始化,D的长度为浮点数。

第 15 题(单选题,2 分)

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

A.
55
B.
77
C.
1010
D.
99

正确答案B

解析详情
答案 B三进制编码与信息量
思路与推导
  1. 每只老鼠最终有第一轮死亡、第二轮死亡、两轮后存活三种可区分状态,m只最多区分3的m次方个酒缸。3⁶=729不足1000,3⁷=2187足够,所以最少7只。

判断题

第 1 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误补码加法
思路与推导
  1. 固定字长的补码加法把超出字长的最高位进位丢弃,不做循环进位;循环加回最低位是反码加法的规则,因此错误。

第 2 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误负数补码的快捷求法
思路与推导
  1. 应保留从最低位到第一个1为止的所有位,把这个1左边的位取反。题目把左右方向写反,所以错误。

第 3 题(判断题,2 分)

一个 8 位二进制原码表示的有符号数,可表示的数值范围是 −128 到 +127。

正确答案错误

解析详情
答案 错误原码表示范围
思路与推导
  1. 8位原码有1位符号位和7位数值位,范围为−127到+127,不能表示−128,因此错误。

第 4 题(判断题,2 分)

这段代码执行后,能够将数组中所有大于 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;
    }
}

正确答案错误

解析详情
答案 错误范围for的值拷贝
思路与推导
  1. int num得到数组元素的副本,给num赋值不会修改原数组,因此错误。要修改数组元素需使用int &num。

第 5 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误最低位与奇偶性
思路与推导
  1. 在通常补码表示下,负奇数如−3的最低位也是1。因此条件能用于判断奇偶,却不能保证数为正,表述错误。

第 6 题(判断题,2 分)

char str[4] = "GESP";

将在内存空间中给 str[4] 分配 5 个字节。

正确答案错误

解析详情
答案 错误字符数组与字符串结尾
思路与推导
  1. 数组声明长度是4,而字符串GESP连同末尾的空字符需要5字节;在C++中这个初始化过长会报错,不会自动扩容为5字节。

第 7 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误字符常量
思路与推导
  1. 字符'0'和'1'应与带单引号的字符常量比较;0和1是数值,通常对应不同字符编码,因此错误。

第 8 题(判断题,2 分)

下面程序执行后,将输出 98 。

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

正确答案正确

解析详情
答案 正确逻辑或的短路
思路与推导
  1. 常用ASCII编码下a为97,大于0,逻辑或的左侧已经为真,右侧b++不执行。b仍为'b'的编码98,因此正确。

第 9 题(判断题,2 分)

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

正确答案正确

解析详情
答案 正确枚举范围优化
思路与推导
  1. 只要通过约束排除的候选不可能成为解,就可以缩小枚举范围而不漏解,因此正确。例如枚举非负鸡兔数量时不必枚举负数。

第 10 题(判断题,2 分)

下面流程图逻辑:初始化 sum←0\mathrm{sum}\leftarrow0,i←0i\leftarrow0;当 i<ni<n 成立时,执行 sum←sum+a[i]\mathrm{sum}\leftarrow\mathrm{sum}+a[i],再执行 i←i+1i\leftarrow i+1;循环结束输出 sum。该流程图可以正确计算一维数组 a[0] ~ a[n] 全部元素的总和。

循环求和流程图

正确答案错误

解析详情
答案 错误循环边界与数组下标
思路与推导
  1. 流程图的条件是i<n,只累加a[0]到a[n-1],不会访问a[n],因此不能计算题目所说a[0]到a[n]的全部元素之和,表述错误。