2022CCF非专业级别软件能力认证第一轮(CSP-J1)入门级C++语言试题阅读程序第1题

阅读程序(程序输入不超过数组或者字符串定义的范围;判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分)

(1)

2022CCF非专业级别软件能力认证第一轮(CSP-J1)入门级C++语言试题阅读程序第1题_第1张图片

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

·判断题

16. 删去第 7 行与第 13 行的 unsigned,程序行为不变。( )

17. 将第 7 行与第 13 行的 short 均改为 char,程序行为不变。()

18. 程序总是输出一个整数“0”。( )

19. 当输入为“2 2”时,输出为“10”。( )

20. 当输入为“2 2”时,输出为“59”。( )

·单选题

21. 当输入为“13 8”时,输出为()。

A.”0” B.”209” C.”197” D.”226”


知识点:本题主要考察学生位运算、十六进和二进制转换、数据类型范围三大知识点。


知识点1:short与unsigned short数据类型

short数据类型的变量占2个字节,1个字节等于8位,2个字节就等于16位。即short变量的范围在 -215~215-1。而unsigned short代表无符号短整型,它的变量范围在0~216-1。


知识点2:|、&、<< 位运算符的基本使用

不管是|、&还是<<,针对的都是二进制数据而言。举个简单的例子,假设用八位二进制数表示十进制5,那么结果为:00000101(高位不够补0),用八位二进制表示十进制数2,那么结果为:00000010(高位不够补0)。

此时让5和2做按位或(|)运算,那么结果为:

00000101

00000010

---------- 只要有一位为1,那么结果为1,当且仅当两位全是0,结果为0

00000111

此时让5和2做按位与(&)运算,那么结果为:

00000101

00000010

----------只要有一位为0,那么结果为0,当且仅当两位全是1,结果为1

00000000

此时让5做左移2位运算,那么运算结果为:

00000101 -> 00010100 左移两位即在最右边补两个0,高位的两个0去掉,此时5扩大了2倍


知识点3:0x十六进制数与二进制的转换规则

一般来说,一位十六进制位可以对应四位二进制位,比如0x33,就可以对应出8位二进制数,一个十六进制的3对应出的二进制数是0011,那么既然现在是两个十六进制的3,那么对应出的就是00110011,再比如0x55,也可以对应出8位二进制数,一个十六进制的5对应出的二进制数是0101,那么既然现在是两个十六进制的5,那么对应出的就是01010101。此时我们就可以利用它们的二进制做按位运算了。


题目解析

有了以上的知识基础之后,我们再来看这道题就会感觉没有那么难了!!!

16. 删去第 7 行与第 13 行的 unsigned,程序行为不变。(

解析:这道题我们要看程序

2022CCF非专业级别软件能力认证第一轮(CSP-J1)入门级C++语言试题阅读程序第1题_第2张图片

第7行,是用一个数按位与上0x33(二进制为00110011),那么得到的结果是不会超过0x33的,因为是按位与操作(比如你用十进制9&十进制5,虽然9的二进制为00001001,5的二进制为00000101,但是与的结果为),

00001001

00000101

——————按位与

00000001,为1,是不会大于5的。

第8行,同理,x的结果是不会超过0x55的,第9行,y的结果是不会超过0x33的,第10行,y的结果是不会超过0x55的。

假设我们取最极端的情况,x的值为0x55,y的值为0x55,再看第11行,将y左移一位,即0x55扩大一倍,0x55的二进制为:01010101,扩大1倍后为:

10101010,然后将10101010和0x55(对应的二进制为01010101)做按位或运算,那么结果为:

10101010

01010101

——————按位或

11111111 对应的十进制为255,即,z最大的值也才255.

根据这个结论,不管是short,还是unsigned short,它们都能够存储255这个数,因此第16题是对的。


17. 将第 7 行与第 13 行的 short 均改为 char,程序行为不变。(❌)

解析:将short改为char,就是unsigned char了,虽然它能够存储下255这个数,但是,输出的z的结果就是一个字符类型,和原来的程序行为不一样。


18. 程序总是输出一个整数“0”。(❌)

19. 当输入为“2 2”时,输出为“10”。 (❌)

20. 当输入为“2 2”时,输出为“59”。 (❌)

解析:将这3题合在一起看,我们不妨将x=2,y=2带入,重新阅读程序。

2022CCF非专业级别软件能力认证第一轮(CSP-J1)入门级C++语言试题阅读程序第1题_第3张图片

x=2,对应的二进制为(假设这里我们用8位表示)00000010

y=2,对应的二进制为(假设这里我们用8位表示)00000010

先将x左移2位,即扩大两倍,那么00000010会变成00001000,然后将扩大两倍后的二进制00001000与原来的x=2的二进制00000010进行按位或运算,

00000010

00001000

——————

00001010 这是按位或的结果,然后将这个数与0x33(00110011)做按位与运算

00110011

——————

00000010 这是按位与的结果,即这是程序第9行的运行结果

再看程序第10行的运算过程

先将x左移一位,即00000010变成00000100,然后将左移1位后的结果与原来的x做按位或的运算,即

00000100

00000010

——————

00000110 这是按位或的结果,然后将这个数与0x55(01010101)做按位与运算

01010101

——————

00000100 这是按位与的结果,即这是程序第10行的运行结果


因为x等于2,y等于2,因此y的最终结果也是00000100,接下来执行第13行的代码,先将y左移1位,即00000100变成00001000,然后再将这个数与x进行按位或运算

00001000

00000100

——————

00001100 这是最终得到的z的结果,转换为十进制数就是12


再看单选题:

21. 当输入为“13 8”时,输出为(B)。

A.”0” B.”209” C.”197” D.”226”


解析:还是按照之前的做法,x=13,y=8,将他们代入程序,先执行程序的第9行,将x=13转换为二进制为00001101,将y=8转换为二进制为00001000。

拿着x左移两位,即00001101变为00110100,再让它与原来的x=13的二进制00001101进行按位或运算,即

00110100

00001101

——————

00111101 这是按位或的结果,然后再将这个结果与0x33(00110011)按位与,即

00110011

——————

00110001 这是按位与的结果,然后将这个结果左移1位,得到01100010,然后将这个结果与原来的x的值(00110001)再做按位或运算

00110001

01100010

——————

01110011 这是按位或的结果,然后再与0x55(01010101)做按位与运算

01010101

——————

01010001 这是按位与的结果,同时也是程序第10行的执行结果


接下来看y的变化,y的二进制为:00001000,先将其左移2位为00100000,然后与原来的y做按位或,即

00001000

00100000

——————

00101000 这是按位或的结果,然后将其与0x33(00110011)做按位与运算,即

00110011

——————

00100000 这是按位与运算的结果,也是程序第11行的运行结果,接下来将这个数左移1位,变为01000000,然后将其与原来的y做按位或运算,即

01000000

00100000

——————

01100000 这是按位或的结果,然后将其与0x55(01010101)做按位与运算,即

01010101

——————

01000000 这是按位与的结果,也是程序第12行的执行结果,接下来再来看程序第13行的运行结果,先将计算出来的第12行的结果左移一位,即01000000变成10000000,然后再将其与第10行计算出来的x进行按位或运算,即

10000000

01010001

——————

11010001,这就是程序第13行的执行结果,同时也是z的值,转换为十进制后为,128+64+16+1=209.因此此题答案选择B选项。

获取更多视频讲解,请联系我

你可能感兴趣的:(CSP-J,c++,csp,信息学奥赛,csp-j,入门级)