1.基本概念
异或是一种二进制的位运算,符号为XOR或 ^表示。
2.运算规则
相同为 0,不同为 1。
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 0
由运算规则可知,任何二进制数与零异或,都会等于其本身,即A ^ 0 = A
3.异或的性质
(1)交换律:A ^ B = B ^ A
(2)结合律:( A ^ B ) ^ C = A ^ ( B ^ C )
(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)
如果我们要输出两个数的异或值时,要加上括号,因为<<的优先级高于 ^
cout<<(a^b)<<endl;
4.例题
1.题意
就是要输出两个数,使得这两个数的异或值等于a。刚开始想着打表找规律,不过没有找到,其实是可以找到的。
2.思路
(1)我们可以用自反性来做这道题,因为要构造a,我们可以输出 1和(1 ^ a),根据自反性这两个数异或就等于a,只不过我们需要特判一下 a==1和a==1e9的时候,因为这两个数不满足这个条件。
(2)假如a的二进制为 110,我们只需要输出二进制为 100和 10的两个数,他们异或就等于 110,这里就要用到lowbit,它返回的是最后一个 1所在的位置的值,比如 110为5,它返回的就是2,二进制10为 2。
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define lowbit(x) ((x)&(-x))
#define ll long long
const int N=1e7+10;
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
ll a;
cin>>a;
if(a==1)
cout<<2<<' '<<3<<endl;
else{
int b=lowbit(a);
if(b==a)
cout<<1<<' '<<a+1<<endl;
else
cout<<b<<' '<<a-b<<endl;
}
}
}