1413:位运算20~21(1)-2

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…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值