阅读程序(程序输入不超过数组或者字符串定义的范围;判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分)
(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,程序行为不变。(✔)
解析:这道题我们要看程序
第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带入,重新阅读程序。
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选项。
获取更多视频讲解,请联系我