【^ 亦或运算符】 实现“变量值交换”和“数组反转”
程序员文章站
2023-11-29 17:41:28
使用 【^ 亦或运算符】 实现【变量值交换】和 【数组反转】废话不多说,直接上代码,一切尽在注释中!!!废话不多说,直接上代码,一切尽在注释中!!!package demo;public class XOR {public static void main(String[] args) {// 使用亦或运算符 更换两个变量的值changeNumber(1, 2);// 2, 1// 定义一个数组 int[] arrOne = { 0, 1, 2,...
使用 【^ 亦或运算符】 实现【变量值交换】和 【数组反转】
废话不多说,直接上代码,一切尽在注释中!!!
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
本文地址:https://blog.csdn.net/weixin_41826641/article/details/107081401
上一篇: C#中遍历Hashtable的4种方法
下一篇: sql 数据库还原图文教程