位运算a&b和a xor b

链接:https://ac.nowcoder.com/acm/contest/7412/D
来源:牛客网
a+b的值为xa&b的值为y,首先需要判断能否有一组a,b满足当前的情况,如果有,那么求出a xor b ,否则输出−1

(其中a,b>0

输入描述:

第一行为一个正整数t,表示组数第一行为一个正整数t,表示组数{}t
(t<=2×1e5)

接下来t行,每一行有两个整数x,y接下来t行,每一行有两个整数x,ytx,y
(0<=x,y<=1×1e18

输出描述:

对于每一组数据,按题意输出a xor b或者-1

示例1

输入

复制
1
2 1

输出

复制
0
示例2

输入

复制
1
2 2

输出

复制
-1
做这个题之前要知道一些位运算公式,
对于二进制的某一位来说,a xor b表示不进位的加法,a & b<<1可以表示加法的进位。所以就有了公式a+b=a xor b+2∗(a & b)
通过这个公式可以直接计算(a xor b),但是需要排除两种不能被组成的情况:
一个就是计算出来的(a xor b)<0;另一个就是a & b和a xor b肯定是取反的,真值表可知除同为0的情况,其他情况下,二者永远相反,所以若不相反说明不存在a,b。
如果都满足说明给出的a+b和a&b可以被构成

对于a&b和a xor b肯定是相反的,
a b a&b a xor b
1 1 1 0
1 0 0 1
0 1 0 1


#include<iostream>
#include<algorithm>
using namespace std;
/*
a+b的值为x,a&b的值为y,首先需要判断能否有一组a,b满足当前的情况,如果有,那么求出a xor b,否则输出-1
(其中a,b>0) 
*/ 
typedef long long ll;
int main(){
    int t;
    cin>>t;
    while(t--){
        ll a,b;
        cin>>a>>b;
        if((a-2*b)<0||((a-2*b)&b)){
            cout<<-1<<endl;
        }
        else{
            cout<<a-2*b<<endl;
        }
    }
}

 

 
posted @ 2020-12-16 23:24  lipu123  阅读(941)  评论(0编辑  收藏  举报