/**
* @Author zengfeiyang
* @Date: 2020-12-11 16:57
* @Description 不用额变量,利用位运算交互两个数
*
* 异或运算
* 异或运算又叫无进位相加,相同为0,不同为1
* 举例:
* a: 0 0 1 1 1 = 7
* b: 0 1 1 0 1 = 13
* ----------------------
* a^b 0 1 0 1 0 = 10
*
* 异或运算特性:
* N ^ N = 0,一个数与自身异或,结果为零
* 0 ^ N = N,一个数与零异或,结果为自身
* 多个数字异或运算符合交换律和结合律
*
* 注意:这两个变量的值可以相同,但必须指向不同的内存区域;
* 不然,指向完本例交互,会将变量指向的值刷为0
*
*/
public class SwapTwoNum {
public static void main(String[] args) {
int a = 8;
int b = 20;
System.out.println(a);
System.out.println(b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a);
System.out.println(b);
System.out.println("=====================");
int[] arr = {2, 35, 532};
System.out.println(arr[0]);
System.out.println(arr[1]);
swap(arr,0,1);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println("=====================");
// 注意:i 和 j 都指向了数组第0下标位置,交换后,被刷为0值了
int[] temp = {45, 12, 22};
int i = 0;
int j = 0;
swap(temp,i,j);
System.out.println(temp[i]+" , "+ temp[j]); }
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
}
打印结果如下:
8
20
20
8
=====================
2
35
35
2
=====================
0 , 0