CSP-J 2021 初赛 阅读程序 第1题
#include <iostream>
using namespace std;
int n;
int a[1000];
int f(int x)
{
int ret=0;
// lowerbit()
// 二进制下,每一次干掉最后一个1
// 00000110 6
// 00000101 5
// 00000100 x & x - 1
for(; x; x &= x - 1) ret++;
return ret;
}
int g(int x)
{
// 二进制下,只保留最后一个1
// 00000110 6
// 11111010 -6, 取反加1, 在计算机中,负数以其正值的补码形式表达
// 00000010 x & -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;
}

错。a[1000], 下标0~999,输入1001时,越界


错。输入5个数,2 11 9 16 10
f(10) = 2, g(10) = 2, 对应的输出是4

对。511998的二进制是 (1111100111111111110)2
f( ) = 16, g( ) = 2, 输出18


B
-65536
65536 = 2^16,
(0000000000000001000000000000000)2
(1111111111111110111111111111111)2
(1111111111111111000000000000000)2, 16个1+16个0
输出 16 + 65536 = 65552
2147483647 = 2^31 - 1
(0111111111111111111111111111111)2, 31个1
输出 31 + 1 = 32