1413:位运算20~21(1)-2
描述
有三个非负整数a、b、c,已知a&b的值等于c(其中&是按位与运算)
求a+b的最大值。
输入
多组案例。一个正整数n,表示案例的数量。(n<=20)
每组案例由一个非负整数c组成。(c小于2的10次方)
输出
一个正整数,表示在所有满足a&b等于c的非负整数对a和b中,a+b的最大值。(其中a和b均小于2的10次方)
每组案例输出完都要换行。
样例输入
1
4
样例输出
1027
767&260=4。a=767,b=260是满足a+b最大的一组解,767+260=1027。
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
int c;
cin >> c;
cout << 1023 + c;
cout << endl;
}
return 0;
}
总结
这道题充分展示了位运算的强大…问题的难点在于算法是什么。如果要让它输出a+b的最大值,那么让a=c,让b的二进制位数全是1,这样按位与运算后a的值仍然是c。所以要表达两者相加,相当于把b转成十进制后加c(也就是a),所以代码是1023(2的10次方-1)+c…