阅读程序1解析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**************************************************************** 
 * Description: 2021_J_1
 * Author: Alex Li
 * Date: 2023-08-23 23:29:58
 * LastEditTime: 2023-08-23 23:36:20
****************************************************************/
#include <iostream>
using namespace std;

int n;
int a[1000];
//f函数是计算x在二进制下有多少个1
int f(int x)
{
    int ret = 0;
    for (; x; x &= x - 1) ret++;
    return ret;
}
//g是计算x最后一位1所代表的数字,位运算中符号位也参与运算。
int g(int x)
{
    return x & -x;
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < n; i++)
        cout << f(a[i]) + g(a[i]) << ' ';
    cout << endl;
    return 0;
}

f(x) 求二进制里1的个数,g(x) 保留x的二进制里的最后一个1,而形成的新二进制数字。


问题一:输入的 n等于 1001时,程序不会发生下标越界。(     )
答:错, 数组下标只能到999,因此会越界。


问题二:输入的 a[i] 必须全为正整数,否则程序将陷入死循环。(   )
答:错,负数也可以位运算。


问题三:当输入为 5 2 11 9 16 10 时,输出为 3 4 3 17 5。(    )
答:错

x(十进制)21191610
X(二进制)1010111001100001010
把x补成8位0000001000001011000010010001000000001010
x-10000000100001010000010000000111100001001
f(x) 13212
按位取反1111110111110100111101101110111111110101
再+1(即-x)1111111011110101111101111111000011110110
g(x)211162
f(x)+g(x)343174

问题四:当输入为 1 511998 时,输出为 18。(   )
答:正确, 511998的二进制是:1111100111111111110,f(x)=16 , g(x)=2 f(x)+g(x)=18


问题五:将源代码中 g 函数的定义(14 – 17 行)移到 main 函数的后面,程序可以正常编译运行。(    )
答:错误, 函数移到后面,需要提前声明函数。


问题六:当输入为 2 -65536 2147483647 时,输出为 (      )。
A. 65532 33   
B. 65552 32
C. 65535 34   
D. 65554 33
选:B ,
2147483647是int的最大值,写成二进制就是01111111111111111111111111111111
1个0加31个1,f(x)=31   g(x)=1    最后答案是32

Scroll to Top