0 #30. 程序阅读(进制与位运算篇)

程序阅读(进制与位运算篇)

CSP 2023 提高级第一轮程序阅读(一)

1 #include <iostream>
2 using namespace std;
3 
4 unsigned short f(unsigned short x) {
5      x ^= x << 6;
6      x ^= x >> 8;
7      return x;
8 }
9 int main() {
10     unsigned short x;
11     cin >> x;
12     unsigned short y = f(x);
13     cout << y << endl;
14     return 0;
15 }

假设输入的 xx 是不超过 6553565535 的自然数,完成下面的判断题和单选题:

判断题

  1. 当输入非零时,输出一定不为零。() {{ select(1) }}
  • T
  • F
  1. f 函数的输入参数的类型改为 unsigned int,程序的输出不变。() {{ select(2) }}
  • T
  • F
  1. 当输入为 6553565535 时,输出为 6363。(){{ select(3) }}
  • T
  • F
  1. 当输入为 11 时,输出为 6464。(){{ select(4) }}
  • T
  • F

单选题

  1. 当输入为 512512 时,输出为()。{{ select(5) }}
  • 3328033280
  • 3341033410
  • 3310633106
  • 3334633346
  1. 当输入为 6464 时,执行完第 55 行后 x 的值为()。{{ select(6) }}
  • 82568256
  • 41304130
  • 41284128
  • 41604160

CSP 2022 入门级第一轮程序阅读(一)

01 #include <iostream>
02
03 using namespace std;
04
05 int main()
06 {
07     unsigned short x, y;
08     cin >> x >> y;
09     x = (x | x << 2)& 0x33;
10     x = (x | x << 1)& 0x55;
11     y = (y | y << 2)& 0x33;
12     y = (y | y << 1)& 0x55;
13     unsigned short z = x | y << 1;
14     cout << z << endl;
15     return 0;
16 }

假设输入的 x,yx,y 均是不超过 1515 的自然数,完成下面的判断题和单选题:

判断题

  1. 删去第 77 行与第 1313 行的 unsigned,程序的行为不变。() {{ select(7) }}
  • T
  • F
  1. 将第 77 行与第 1313 行的 shor 改为 char,程序的行为不变() {{ select(8) }}
  • T
  • F
  1. 程序总是输出一个整数 00。(){{ select(9) }}
  • T
  • F
  1. 当输入为 2 2 时,输出为 1010。(){{ select(10) }}
  • T
  • F
  1. 当输入为 2 2 时,输出为 5959。(){{ select(11) }}
  • T
  • F

单选题

  1. 当输入为 13 8 时,输出为()。{{ select(12) }}
  • 00
  • 209209
  • 197197
  • 226226

CSP 2021 入门级第一轮程序阅读(一)

01 #include <iostream>
02 using namespace std;
03 
04 int n;
05 int a[1000];
06 
07 int f(int x)
08 {  
09     int ret = 0;    
10     for (; x; x &= x - 1) ret++;
11     return ret;
12 }
13     
14 int g(int x)   
15 {
16     return x & -x;
17 }
18
19 int main()
20 {
21     cin >> n;
22     for (int i = 0; i < n; i++) cin >> a[i];
23     for (int i = 0; i < n; i++)
24         cout << f(a[i]) + g(a[i]) << " ";
25     cout << endl;
26     return 0;
27 }
  1. 输入的 nn 等于 10011001 时,程序 不会 发生下标越界。( ) {{ select(13) }}
  • 正确
  • 错误
  1. 输入的 a[i] 必须全为正整数,否则程序将陷入死循环。() {{ select(14) }}
  • 正确
  • 错误
  1. 当输入为 5 2 11 9 16 10 时,输出为 3 4 3 17 5。( ) {{ select(15) }}
  • 正确
  • 错误
  1. 当输入为 1 511998 时,输出为 18。( ) {{ select(16) }}
  • 正确
  • 错误
  1. 将源代码中 gg 函数的定义(141714-17 行)移到 main 函数的后面,程序可以正常编译运 行。( ) {{ select(17) }}
  • 正确
  • 错误
  1. 当输入为 2 -65536 2147483647 时,输出为( )。 {{ select(18) }}
  • 65532 33
  • 65552 32
  • 65535 34
  • 65554 33

1 #include <bits/stdc++.h>
2 using namespace std;
3 int x, y;
4 unsigned int n;
5 int main() {
6     cin >> n >> x >> y;
7     unsigned int mask = 0xff;
8     int x8 = x << 3;
9     int y8 = y << 3;
10    unsigned int nx = (n >> x8) & mask, ny = (n >> y8) & mask;
11    n &= (~(mask << x8));
12    n &= (~(mask << y8));
13    n |= (nx << y8);
14    n |= (ny << x8);
15    cout << "0x";
16    cout << std::hex << n << endl;
17    return 0;
18 }

假设输入的 nn3232 位无符号整数范围内的整数,x,yx,y 是不超过 33 的自然数,完成下面的判断题和单选题。

判断题

  1. 代码中 mask 变量的值转化为二进制的低 1616 位结果是 0000 0000 1111 1111\texttt{0000 0000 1111 1111}()。 {{ select(19) }}
  • T
  • F
  1. 当输入 x=0x=0 的时候,nxnx 表示 nn 中最低八位对应的字节的数据。( ) {{ select(20) }}
  • T
  • F
  1. 去掉程序第 1111 行至第 1212 行中 (~(mask << x8))(~(mask << y8)) 两处中的最内层 括号不会改变程序的结果。( ) {{ select(21) }}
  • T
  • F

单选题

  1. 当输入为 15078 0 1 时,变量 nx,nynx,ny 的值分别为多少?( ) (提示:十进制数 1507815078 与十六进制数 3AE6\text{3AE6} 相同) {{ select(22) }}
  • 0xE6, 0x3A\text{0xE6, 0x3A}
  • 0x6, 0xE0\text{0x6, 0xE0}
  • 0x6, 0xE\text{0x6, 0xE}
  • 0x6, 0xA\text{0x6, 0xA}
  1. 当输入为 23270 0 1 时,输出为多少?( ) (提示:十进制数 2327023270 与十六进制数 5AE6\text{5AE6} 相同) {{ select(23) }}
  • 0x5AE6\text{0x5AE6}
  • 0x5E6A\text{0x5E6A}
  • 0xA56E\text{0xA56E}
  • 0xE65A\text{0xE65A}
  1. 以下哪一个变量的类型修改可能影响程序的输出?( ) {{ select(24) }}
  • x,yx,y 修改为 unsigned int 类型。
  • x8,y8x8,y8 修改为 short 类型。
  • maskmask 修改为 int 类型。
  • nx,nynx,ny 修改为 unsigned long long 类型。