zoukankan      html  css  js  c++  java
  • 位运算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;
            }
        }
    }
     
  • 相关阅读:
    使用Docker搭建nginx环境
    使用Docker搭建apache环境
    字符编码-字库表,字符集,字符编码
    go中的sync.pool源码剖析
    JAVA基础语法
    Linux 文件目录管理
    c++ 学习之常用时间函数一览
    MySQL Innodb 中的锁
    MySQL 索引与 B+ 树
    MySQL 表分区操作详解
  • 原文地址:https://www.cnblogs.com/lipu123/p/14146956.html
Copyright © 2011-2022 走看看