【^ 亦或运算符】 实现【变量值交换】和 【数组反转】

    技术2022-07-13  81

    使用 【^ 亦或运算符】 实现【变量值交换】和 【数组反转】

    废话不多说,直接上代码,一切尽在注释中!!!

    废话不多说,直接上代码,一切尽在注释中!!!

    package demo; public class XOR { public static void main(String[] args) { // 使用亦或运算符 更换两个变量的值 changeNumber(1, 2);// 2, 1 // 定义一个数组 int[] arrOne = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] arrTwo = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] arrThree = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] arrFour = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 将数组的顺序倒置 // 遍历 然后将 数组第一个元素和最后一个元素互换 // 将第二个元素和倒数第二个元素呼唤 // 以此类推 完成反转 // 方法一 methodOne(arrOne); // 方法二 methodTwo(arrTwo); // 方法二代码简化第一版 methodTwoSimpleFirst(arrThree); // 方法二代码简化第二版 methodTwoSimpleSecond(arrFour); } public static void changeNumber(int x, int y) { /* * 建立亦或关系 * 亦或: 两数相同为假 两数不同为真 * 可得 : 知道三个数中的任两个数,便可推导出第三个数的值 * * 关系式为: x ^ y = z; * 对应实体值为: 0 ^ 1 = 1; * * 已知 x y 则z可推导 x ^ y = z * 0 1 0 ^ 1 = 1 * * 已知 x z 则y可推导 x ^ z = y * 0 1 0 ^ 1 = 1 * * 已知 y z 则x可推导 y ^ z = x * 1 1 1 ^ 1 = 0 */ // int z = x ^ y; x = x ^ y; // @1 y = x ^ y; // @2 x = x ^ y; // @3 /* * @1 x = z; * @2 y = z ^ y = x; * @3 x = z ^ x = y; * * 至此 交换完成 */ System.out.println("参数一的值已经更换为:" + x); System.out.println("参数二的值已经更换为:" + y); } public static void methodOne(int[] arr) { for (int i = 0; i < arr.length / 2; i++) { int temp = arr[i]; arr[i] = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = temp; } echoArr(arr); } // 方法二 public static void methodTwo(int[] arr) { for (int i = 0; i < arr.length / 2; i++) { /* * 建立亦或关系 * 亦或: 两数相同为假 两数不同为真 * 可得 : 知道三个数中的任两个数,便可推导出第三个数的值 * * 关系式为: x ^ y = z; * 对应实体值为: 0 ^ 1 = 1; * * 已知 x y 则z可推导 x ^ y = z * 0 1 0 ^ 1 = 1 * * 已知 x z 则y可推导 x ^ z = y * 0 1 0 ^ 1 = 1 * * 已知 y z 则x可推导 y ^ z = x * 1 1 1 ^ 1 = 0 */ // 方便理解 定义三个变量来写 // 需要交换的前面的数 int x = arr[i]; // 需要交换的后面的数 int y = arr[arr.length - 1 - i]; // 第三个用到的工具数值 int z = x ^ y; // 至此三个关系数据都已经确定 // 想让头尾两数交换 即让 x = y; y = x; // 已知 y = x ^ z; // 若让 x = y; // 即让 x = x ^ z; x = x ^ z; // 已知 x = y ^ z; // 若让 y = x; // 即让 y = y ^ z; y = y ^ z; arr[i] = x; arr[arr.length - 1 - i] = y; } echoArr(arr); } // 方法二代码简化第一版 public static void methodTwoSimpleFirst(int[] arr) { for (int i = 0; i < arr.length / 2; i++) { int x = arr[i]; int y = arr[arr.length - 1 - i]; // int z = x ^ y; x = x ^ y; // @1 y = x ^ y; // @2 x = x ^ y; // @3 /* * @1 x = z; * @2 y = z ^ y = x; * @3 x = z ^ x = y; * * 至此 交换完成 */ arr[i] = x; arr[arr.length - 1 - i] = y; } echoArr(arr); } // 方法二代码简化第二版 public static void methodTwoSimpleSecond(int[] arr) { for (int i = 0; i < arr.length / 2; i++) { // x = z; arr[i] = arr[i] ^ arr[arr.length - 1 - i]; // y = z ^ y = x; arr[arr.length - 1 - i] = arr[i] ^ arr[arr.length - 1 - i]; // x = z ^ x = y; arr[i] = arr[i] ^ arr[arr.length - 1 - i]; } echoArr(arr); } // 输出数组 public static void echoArr(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } }

    附本机执行结果如下:

    参数一的值已经更换为:2 参数二的值已经更换为:1 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0

    Processed: 0.023, SQL: 10