C++学习--异或运算的应用

异或运算

^异或 如果a、b两个值不同,则异或结果为1,a、b两个值相同,异或结果为0;可以理解为无进位相加
异或运算性质:

0^任意数 = 任意数;
任意数^任意数=0;
如果a^b=c, 则a=b^c=c^b,b=a^c=c^a;
满足交换律:a^b^c=b^a^c=c^a^b=c^b^a;

交换a与b两个数,三步异或:

a = a^b 
b = a^b //b=a^b <=> b=(a^b)^b <=> b=a^b^b <=> b=a^0 <=> b=a
a = a^b //a=a^b <=> a=a^b^a <=> a=a^a^b <=> a=0^b <=> a=b 

则交换函数可以写为:

void swap(vector<int> arr, int i, int j){
	arr[i] = arr[i] ^ arr[j];
    arr[j] = arr[i] ^ arr[j];
    arr[i] = arr[i] ^ arr[j];
}

交换的i,j两个数必须为不同值,跟交换的两个数值没有关系,必须为两个空间的值,如果为同一个空间内的值进行交换,其结果为0,例如:

test[0] = test[0] ^ test[0];
test[0] = test[0] ^ test[0];
test[0] = test[0] ^ test[0];
最终test[0]的值为0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值