5618:[GESP202609三级] 客观题

文件提交:无需freopen 内存限制:128 MB 时间限制:1.000 S
评测方式:文本裁判
金币值:
命题人:
提交:0 解决:0

题目描述

## 一、单选题(每题 2 分,共 30 分) **第 1 题** 关于计算机的数据编码,下面说法不正确的是(  ) - 数字 $5$,不管采用原码、反码、补码,它的 $8$ 位二进制形式都是 $(0000\ 0101)_2$。 - 计算机科学中,单位换算默认 $1\text{KB} = 1024\text{B}$,而非 $1000\text{B}$。 - 原码是最直观的一种有符号数表示方法。 - 反码运算中,最高位进位要抛掉。 **第 2 题** 关于进制转换,下面说法不正确的是(  ) - 数字 $1101B$ 可以分解为:$1\times2^3+1\times2^2+0\times2^1+1\times2^0=8+4+0+1=13$(十进制) - 数字 $42Q$ 可以分解为:$4\times8^1+2\times8^0=32+2=34$(十进制) - 数字 $2BEH$ 可以分解为:$2\times16^2+11(\text{B})\times16^1+14(\text{E})\times16^0=512+176+14=702$(十进制) - $345Q = 0E3H$(通常写作 $E3H$) **第 3 题** 下面程序的运行结果是(  ) ```cpp 01 #include 02 using namespace std; 03 int main() { 04    int x = 1; 05    for (int i = 0; i = 0; i <= 5) { 06        x++; 07   } 08    cout << x << endl; 09    return 0; 10 } ``` - $1$ - $10$ - $15$ - 程序编译错误 **第 4 题** 关于计算机编码中补码,下面说法错误的是(  ) - 正数的补码:与其原码、反码相同。 - 负数的补码:将其对应的正数的原码按位取反(得到反码),然后加 $1$。 - $8$ 位的补码,最大表示数据是 $128$,最小表示数据是 $-128$。 - 负数的补码,从右往左扫描正数的二进制形式,遇到第一个 $1$ 之后,左边的所有位都取反。 **第 5 题** 下面程序执行的结果是(  ) ```cpp 01 #include 02 using namespace std; 03 int main() { 04    int x = 2026; 05    int count = 0; 06    while (x > 0) { 07        count++; 08        x = x & (x - 1); 09   } 10    cout << count << endl; 11 } ``` - $2026$ - $8$ - $16$ - $32$ **第 6 题** 关于位运算,下列说法错误的是(  )。 - 找唯一数:数组中唯一出现一次的数,其余出现两次,全部异或结果即为该数。例子:数组 `[5, 7, 9, 7, 5]`(唯一数是 $9$) - 若左移导致高位溢出(如超过整型范围),结果不再符合乘法规律。 - 有符号整数左移溢出时结果确定。 - $n+2$ 位二进制数 $A_1A_2\cdots A_n00$,一定是 $4$ 的倍数(最后两位 $00$ 是二进制的 $00$)。 **第 7 题** 计算 `3 & 7 | 15 ^ ~11 (a=3, b=7, c=15, d=11 )`:(  ) - $-9$ - $-1$ - $-7$ - $-5$ **第 8 题** 下面函数是一个加密解密的函数,横线处应该填入的程序段是(  ) ```cpp 01 #include 02 #include 03 using namespace std; 04 int main() { 05 int key; 06 cin >> key; 07 string msg = "Hello GESP"; 08 cout << msg << endl; 09 for (int i = 0; i < msg.size(); i++) { 10 msg[i] = msg[i] ^ key; 11 } 12 cout << msg << endl; 13 -------------------------------- 14 cout << msg << endl; 15 return 0; 16 } ``` - ```cpp 01 for (int i = 0; i < msg.size(); i++) { 02 msg[i] = msg[i] | key; 03 } ``` - ```cpp 01 for (int i = 0; i < msg.size(); i++) { 02 msg[i] = msg[i] >> key; 03 } ``` - ```cpp 01 for (int i = 0; i < msg.size(); i++) { 02 msg[i] = msg[i] ^ key; 03 } ``` - ```cpp 01 for (int i = 0; i < msg.size(); i++) { 02 msg[i] = msg[i] & key; 03 } ``` **第 9 题** 下列程序是分别判断输入的 $N$ 个数是否可能是二进制、八进制、十进制、十六进制,横线处应该填入的是(  ) ```cpp 01 #include 02 using namespace std; 03 int main() { 04 int n = 0; 05 cin >> n; 06 for (int i = 0; i < n; i++) { 07 char str[11]; 08 cin >> str; 09 char max = '0'; 10 for (int i = 0; str[i] != '\0'; i++) 11 if (str[i] > max) 12 max = str[i]; 13 ------------------------------ 14 } 15 return 0; 16 } ``` - `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$,代表没有任何权限。如果想实现如下的操作:添加读权限;添加写权限;清除读权限、其他位不变;添加删除权限。则横线处应该填入的是(  )。 ```cpp 01 #include 02 using namespace std; 03 04 int main() { 05 const int READ = 1 << 0; 06 const int WRITE = 1 << 1; 07 const int MODIFY = 1 << 2; 08 const int DELETE_ = 1 << 3; 09 int mask = 0; 10 -------------------- 11 return 0; 12 } ``` - ```cpp 01 mask = mask | READ; 02 mask = mask | WRITE; 03 mask = mask & (~READ); 04 mask = mask | DELETE_; ``` - ```cpp 01 mask = mask & READ; 02 mask = mask & WRITE; 03 mask = mask | (~READ); 04 mask = mask & DELETE_; ``` - ```cpp 01 mask = mask | READ; 02 mask = mask & WRITE; 03 mask = mask & (~READ); 04 mask = mask | DELETE_; ``` - ```cpp 01 mask = mask | READ; 02 mask = mask | WRITE; 03 mask = mask | (~READ); 04 mask = mask | DELETE_; ``` **第 11 题** 下面选项中提到的变量都是正整数,关于位运算,下面说法错误的是(  ) - `num >> 1`,对于正整数,等价于对 `num` 做整数除以 $2$,向下取整 - `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` 的结果是(  ) - $5$ - $13$ - $7$ - $28$ **第 13 题** 关于 $string$ 的成员函数,下面说法错误的是(  ) - `size()` 返回字符串的字符个数,不包含末尾的 `'\0'`;`length()` 和 `size()` 功能完全等价 - `s.empty()`:字符串为空时返回 `true`,字符串不为空返回 `false` - `s.substr(pos, len)`,当省略第二个参数 `len` 时,代表从 `pos` 位置一直截取到字符串末尾 - `s.erase(2)` 表示删除字符串中下标为 2 的这一个字符 **第 14 题** 以下数组定义,符合 `C++` 语法的是(  ) - `int a[] = {1, 2, 3.0};` - `int b['A'];` - `int c[ ];` - `float d[10.0];` **第 15 题** 三进制有个奇妙的应用,有 $1000$ 个酒缸,恰好 $1$ 缸有毒。毒酒喝下后 $24$ 小时毒发死亡;无毒酒无影响。总共有 $48$ 小时,可以做两轮实验,每轮可以重新安排老鼠喝酒。有三种情况,这只老鼠两轮都不喝这缸酒;这只老鼠第一轮喝这缸酒;这只老鼠第二轮喝这缸酒,要保证找出毒酒,最少需要多少只老鼠?(  ) - $5$ - $7$ - $10$ - $9$ ## 二、判断题(每题 2 分,共 20 分) **第 1 题** 对于计算机编码运算,补码做加法运算时,如果最高位产生进位,需要把该进位循环加到结果的最低位。 - 正确 - 错误 **第 2 题** 求 $-13$ 的补码,可以对正数 $13$ 的二进制,从右向左扫描,遇到第一个 $1$ 之后,右边所有位全部取反,左边保持不变。 - 正确 - 错误 **第 3 题** 一个 $8$ 位二进制原码表示的有符号数,可表示的数值范围是 $-128$ 到 $+127$。 - 正确 - 错误 **第 4 题** 这段代码执行后,能够将数组中所有大于 $0$ 的元素赋值为 $0$。 ```cpp 01 int a[] = {2, -5, 7, 0, -1}; 02 int n = sizeof(a) / sizeof(a[0]); 03 for (int num : a) { 04    if (num > 0) { 05        num = 0; 06   } 07 } ``` - 正确 - 错误 **第 5 题** $a$ 是 `int` 有符号整型,若 `(a & 1) == 1` 结果为 `true`,则 $a$ 一定是正奇数。 - 正确 - 错误 **第 6 题** `char str[4] = "GESP";` 将在内存空间中给 `str[4]` 分配 $5$ 个字节。 - 正确 - 错误 **第 7 题** 判断字符串中字符是否是 '0' 或者 '1' ,可以写条件:`if(str[i]==0 || str[i]==1)`。 - 正确 - 错误 **第 8 题** 下面程序执行后,将输出 $98$。 ```cpp 01 #include 02 using namespace std; 03 int main() { 04    int a = 'a', b = 'b'; 05    if (a > 0 || b++ > 0) { 06   } 07    cout << b; 08 } ``` - 正确 - 错误 **第 9 题** 枚举可以在保证不漏解的前提下缩小枚举范围,不是必须遍历全部。 - 正确 - 错误 **第 10 题** 下面流程图逻辑:初始化 $sum \leftarrow 0$,$i \leftarrow 0$;当 $i \lt n$ 成立时,执行 $sum \leftarrow sum + a[i]$,再执行 $i \leftarrow i + 1$;循环结束输出 $sum$。该流程图可以正确计算一维数组 $a[0] \sim a[n]$ 全部元素的总和。 ![](/upload/www.aknoi.com/20260918174029//wxbIynV_9-snkPuwv-_cC.png) - 正确 - 错误

来源/分类