摘要
对于数A=2,B=3,在不引入第三个变量C的条件下,交换使得A=3,B=2。
1. 加法算数运算
- 原理:如果我们知道两数之和和其中一个数,那么就可以得到另一个数。
// 为了更直观地理解,我刻意加入了下标
int A1 = 2, B1 = 3;
// 用A来存储两数之和,A2 = 5
A2 = A1 + B1;
// 两数之和减去B的初始值就等于A的初始值,B2 = 2
B2 = A2 - B1 = A1 + B1 - B1 = A1;
// 两数之和减去B的当前值就等于A的当前值,A3 = 3
A3 = A2 - B2 = A1 + B1 - A1 = B1;
2. 减法算数运算
- 原理:如果我们知道两数之差和其中一个数,那么也可以得到另一个数。本质上和加法算数运算是一样的。
// 为了更直观地理解,我刻意加入了下标
int A1 = 2, B1 = 3;
// 用A来存储两数之差,A2 = 1
A2 = B1 - A1;
// B的初始值减去两数之差等于A的初始值,B2 = 2
B2 = B1 - A2 = B1 - (B1 - A1) = A1;
// B的当前值加上两数之差等于A的当前值,A3 = 3
A3 = B2 + A2 = A1 + B1 - A1 = B1;
3. 异或位运算
- 异或:两个运算位,相同为0,不同为1。
1 ^ 1 = 0;
0 ^ 0 = 0;
1 ^ 0 = 1; // 交换运算位值不变,0 ^ 1 = 1
- 原理: 一个数与另一个数异或两次,值不变。
// 第一个运算位是初始值,第二第三个是异或两次的数
(1 ^ 0) ^ 0 = 1 ^ 0 = 1
(1 ^ 1) ^ 1 = 0 ^ 1 = 1
(0 ^ 1) ^ 1 = 1 ^ 1 = 0
(0 ^ 0) ^ 0 = 0 ^ 0 = 0
由此得:
// 为了更直观地理解,我刻意加入了下标
int A1 = 2, B1 = 3;
A2 = A1 ^ B1;
B2 = A2 ^ B1 = A1 ^ B1 ^ B1 = A1;
A3 = A2 ^ B2 = A1 ^ B1 ^ A1 = B1;