^ 也叫无进位相加,原理是相同为0不同为1,当我们把两个数进行二进制异或运算时,比方说a = 100011,b = 011010,此时 a^b 如下
```
a 100011
b 011010
结果 111001
```
异或还满足如下几个特性:
1. a^0 = a 任何数与0的异或都为它本身
2. a^a = 0 任何数与本身的异或都为0
3. a^b = b^a ,a^b^c = a^(c^b) 异或满足交换律和结合律
看如下代码分析为什么异或可以交换?
```
private static void swap(int i, int j) {
i = i ^ j;
j = i ^ j;
i = i ^ j;
}
```
分析如下:
```
private static void swap(int i, int j) {
i = i ^ j; // 此时i = i^j ,j = j
j = i ^ j; // 此时j = i^j^j ,i = i^j j^j = 0 则j = i^0 = i
i = i ^ j; // 同上
}
```
**注意**:但用异或交换时,两个交换的数据必须指向不同的内存,值可以相等,内存不可以相等。
当用于在数组中的i,j位置交换数据时,一定要保证i位置不能等于j位置,否则就会将数据中的数据抹为0了,原因是上面的特性2。