试卷解析 · 理解每一步
2026-09-Level-3
2026-09-Level-3
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题,2 分)
关于计算机的数据编码,下面说法不正确的是( )。
正确答案D
解析详情
反码加法出现最高位进位时,要把进位加回最低位,称为循环进位;直接丢弃进位的是固定字长补码加法的处理,因此D错误。
第 2 题(单选题,2 分)
关于进制转换,下面说法不正确的是( )
正确答案D
解析详情
八进制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
解析详情
for的第二项是i=0,执行赋值后的表达式值为0,条件为假,循环体一次也不执行。x保持1,输出1;这段语法可以编译。
第 4 题(单选题,2 分)
关于计算机编码中补码,下面说法错误的是( )。
正确答案C
解析详情
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;
}正确答案B
解析详情
x & (x-1)每次清除二进制中最低位的一个1。2026的二进制为11111101010,共8个1,所以循环8次,输出8。
第 6 题(单选题,2 分)
关于位运算,下列说法错误的是( )。
正确答案C
解析详情
C错误:在本题采用的C++14语境下,有符号左移不满足标准规定的取值条件时可能产生未定义行为,不能保证结果确定。异或能抵消成对相同数;末尾两个二进制0表示能被4整除。
第 7 题(单选题,2 分)
计算 3 & 7 | 15 ^ ~11 ( a=3, b=7, c=15, d=11 ):( )。
正确答案D
解析详情
先算~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;
}for (int i = 0; i < msg.size(); i++) {
msg[i] = msg[i] | key;
}for (int i = 0; i < msg.size(); i++) {
msg[i] = msg[i] >> key;
}for (int i = 0; i < msg.size(); i++) {
msg[i] = msg[i] ^ key;
}for (int i = 0; i < msg.size(); i++) {
msg[i] = msg[i] & key;
}正确答案C
解析详情
同一个值连续异或相同的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;
}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;正确答案A
解析详情
在题设使用合法数码字符的语境下,最大字符不超过'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;
}mask = mask | READ;
mask = mask | WRITE;
mask = mask & (~READ);
mask = mask | DELETE_;mask = mask & READ;
mask = mask & WRITE;
mask = mask | (~READ);
mask = mask & DELETE_;mask = mask | READ;
mask = mask & WRITE;
mask = mask & (~READ);
mask = mask | DELETE_;mask = mask | READ;
mask = mask | WRITE;
mask = mask | (~READ);
mask = mask | DELETE_;正确答案A
解析详情
用按位或添加权限,用mask & ~READ清除读权限并保留其他位。A使mask依次为1、3、2、10,最后保留写和删除权限。
第 11 题(单选题,2 分)
下面选项中提到的变量都是正整数,关于位运算,下面说法错误的是( )。
正确答案D
解析详情
对正整数右移一位等于除以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 的结果是( )
正确答案C
解析详情
表达式按((!a)&(b<<c))^d|e计算。!0=1,2<<11=4096,1&4096=0,0^7=7,7|5=7,因此选C。
第 13 题(单选题,2 分)
关于 string 的成员函数,下面说法错误的是( )
正确答案D
解析详情
s.erase(2)会删除从下标2到字符串末尾的全部字符;若只删除下标2这一个字符,应使用s.erase(2,1),所以D错误。
第 14 题(单选题,2 分)
以下数组定义,符合 C++ 语法的是( )
int a[] = {1, 2, 3.0};int b['A'];int c[ ];float d[10.0];正确答案B
解析详情
'A'是整型常量表达式,可以作为数组长度,因此B合法。A把double值3.0放入int列表初始化,属于被禁止的窄化转换;C没有长度也没有初始化,D的长度为浮点数。
第 15 题(单选题,2 分)
三进制有个奇妙的应用,有 1000 个酒缸,恰好 1 缸有毒。毒酒喝下后 24 小时毒发死亡;无毒酒无影响。总共有 48 小时,可以做两轮实验,每轮可以重新安排老鼠喝酒。有三种情况,这只老鼠两轮都不喝这缸酒;这只老鼠第一轮喝这缸酒;这只老鼠第二轮喝这缸酒,要保证找出毒酒,最少需要多少只老鼠?( )
正确答案B
解析详情
每只老鼠最终有第一轮死亡、第二轮死亡、两轮后存活三种可区分状态,m只最多区分3的m次方个酒缸。3⁶=729不足1000,3⁷=2187足够,所以最少7只。
判断题
第 1 题(判断题,2 分)
对于计算机编码运算,补码做加法运算时,如果最高位产生进位,需要把该进位循环加到结果的最低位。
正确答案错误
解析详情
固定字长的补码加法把超出字长的最高位进位丢弃,不做循环进位;循环加回最低位是反码加法的规则,因此错误。
第 2 题(判断题,2 分)
求 −13 的补码,可以对正数 13 的二进制,从右向左扫描,遇到第一个 1 之后,右边所有位全部取反,左边保持不变。
正确答案错误
解析详情
应保留从最低位到第一个1为止的所有位,把这个1左边的位取反。题目把左右方向写反,所以错误。
第 3 题(判断题,2 分)
一个 8 位二进制原码表示的有符号数,可表示的数值范围是 −128 到 +127。
正确答案错误
解析详情
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;
}
}正确答案错误
解析详情
int num得到数组元素的副本,给num赋值不会修改原数组,因此错误。要修改数组元素需使用int &num。
第 5 题(判断题,2 分)
a 是 int 有符号整型,若 (a & 1) == 1 结果为 true ,则 a 一定是正奇数。
正确答案错误
解析详情
在通常补码表示下,负奇数如−3的最低位也是1。因此条件能用于判断奇偶,却不能保证数为正,表述错误。
第 6 题(判断题,2 分)
char str[4] = "GESP";将在内存空间中给 str[4] 分配 5 个字节。
正确答案错误
解析详情
数组声明长度是4,而字符串GESP连同末尾的空字符需要5字节;在C++中这个初始化过长会报错,不会自动扩容为5字节。
第 7 题(判断题,2 分)
判断字符串中字符是否是 '0' 或者 '1' ,可以写条件: if(str[i]==0 || str[i]==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;
}正确答案正确
解析详情
常用ASCII编码下a为97,大于0,逻辑或的左侧已经为真,右侧b++不执行。b仍为'b'的编码98,因此正确。
第 9 题(判断题,2 分)
枚举可以在保证不漏解的前提下缩小枚举范围,不是必须遍历全部。
正确答案正确
解析详情
只要通过约束排除的候选不可能成为解,就可以缩小枚举范围而不漏解,因此正确。例如枚举非负鸡兔数量时不必枚举负数。
第 10 题(判断题,2 分)
下面流程图逻辑:初始化 ,;当 成立时,执行 ,再执行 ;循环结束输出 sum。该流程图可以正确计算一维数组 a[0] ~ a[n] 全部元素的总和。

正确答案错误
解析详情
流程图的条件是i<n,只累加a[0]到a[n-1],不会访问a[n],因此不能计算题目所说a[0]到a[n]的全部元素之和,表述错误。