返回顶部

牛客小白月赛28 D.位运算之谜 (位运算)

  • 题意:给你两个正整数\(x\)\(y\),求两个正整数\(a\),\(b\),使得\(a+b=x\),\(a\)&\(b\)=\(y\),如果\(a\),\(b\),输出\(a\ xor \ b\),否则输出\(-1\).

  • 题解:根据位运算的基本性质,我们知道\(a\ xor \ b\)可以表示不进位的加法,而(\(a\)&\(b\))<<1可以表示相加后进位的\(1\),所以\(a+b=a\ xor \ b+2*(a\)&\(b)\).然而我们还要判断是否成立,首先\(a\ xor\ b\)一定不能是负数,其次\(a\ xor\ b\)&(\(a\)&b)一定等于0.

  • 代码:

    int t;
    ll x,y;
    
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        t=read();
        while(t--){
        	scanf("%lld %lld ",&x,&y);
        	ll cnt=x-2*y;
        	if(cnt<0 || (cnt&y)!=0) puts("-1");
        	else printf("%lld\n",cnt);
        }
    
        return 0;
    }
    
posted @ 2020-09-24 20:26  _Kolibri  阅读(131)  评论(0)    收藏  举报