当前位置: 移动技术网 > IT编程>开发语言>Java > 【^ 亦或运算符】 实现【变量值交换】和 【数组反转】

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

2020年07月03日  | 移动技术网IT编程  | 我要评论

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

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网