不借助第三变量进行两数交换有两种方法:
数值计算法:
加数 + 加数 = 和
被减数(和) - 减数 = 差
被减数 (和)- 差 = 减数
位运算法:
任意一个数与任意一个给定的值连续异或两次,值不变
m = m ^ n ^ n;
n = n ^ m ^ m;
具体代码演示:
public class Demo {
public static void main(String[] args) {
/**
* 引用第三变量 temp,完成 numa 与 numb 交换
*/
int numa = 4, numb = 5, temp;
System.out.println("交换前:" + numa + " " + numb);
temp = numa;
numa = numb;
numb = temp;
System.out.println("交换后:"+ numa + " " + numb);
/**
* 不借助第三变量,进行两数交换
*
* 数值计算方法
*
* 加数 + 加数 = 和
* 被减数(和) - 减数 = 差
* 被减数 (和)- 差 = 减数
*/
System.out.println("---数值运算法---");
int num1 = 4, num2 = 5;
System.out.println("交换前:" + num1 + " " + num2);
// 加数 + 加数 = 和
// 将2数相加,存储在num1中
num1 = num1 + num2;
// 被减数 - 减数 = 差
// num1中存储值是2数的和,num1 - num2 得到的是原来 num1 的值, 此时num1还是2数之和
num2 = num1 - num2;
// 被减数 - 差 = 减数
// num1中存储值是2数的和,num1 是2数之和,num2是原来num1 的值,num1 - num2 得到原来num2的值
num1 = num1 - num2;
System.out.println("交换后:"+ num1 + " " + num2);
/**
*
* 位运算方法
*
* 任意一个数与任意一个给定的值连续异或两次,值不变
* m = m ^ n ^ n;
* n = n ^ m ^ m;
*
*/
System.out.println("---位运算法---");
System.out.println("交换前:" + num1 + " " + num2);
// 将num1和num2异或的结果放入num1中
num1 = num1 ^ num2;
// num2 = num1 ^ num2 ^ num2
num2 = num1 ^ num2;
// num1 = num1 ^ num2 ^ num1
num1 = num1 ^ num2;
System.out.println("交换后:"+ num1 + " " + num2);
}