异或运算
^异或 如果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