二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
一、程序阅读
#include <iostream> using namespace std; unsigned short f(unsigned short x) { x ^= x << 6; x ^= x >> 8; return x; } int main() { unsigned short x; cin >> x; unsigned short y = f(x); cout << y << endl; return 0; }
二、题目分析
假设输入的 x 是不超过 65535 的自然数,完成下面的判断题和单选题:
判断题
1. 当输入非零时,输出一定不为零。(对)
【输入非零,说明x的二进制形式中一定有一个1,原本最右边的1对应左移之后的那一位一定是0,所以执行第一次后一定还有1;第二次同理,执行完第一次的到的数,在右移之前最左边的1对应右移之后的那一位一定是0,所以执行完第二次之后依然有1,故大于0】
2. (2 分)将
f
函数的输入参数的类型改为unsigned int
,程序的输出不变。(错)【改成unsigned int 类型之后,执行第一步后本来应该消失的高位却移到后面参与运算,改变了第一次的结果;第二次右移8位时,第一次运算结果多余部分的前8位移了回来,参与了运算,直接改变了结果】
3. 当输入为
65535
时,输出为63
。(对)【直接计算,^表示异或运算】
4. 当输入为
1
时,输出为64
。(错)【答案是65】
单选题
1. 当输入为
512
时,输出为(B)。A.
33280
B.
33410
C.
33106
D.
33346
【
答案为33410】2. 当输入为
64
时,执行完第 5 行后x
的值为(D)。A.
8256
B.
4130
C.
4128
D.
4160
【
注意是执行完第 5 行】
看不懂评论区见,大家一起解答,有问题请反应~