欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-10-21 20:05:01
使用 【^ 亦或运算符】 实现【变量值交换】和 【数组反转】废话不多说,直接上代码,一切尽在注释中!!!废话不多说,直接上代码,一切尽在注释中!!!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