异或的性质与应用

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;
		}
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值