1. 程式人生 > >如何在不使用第三個變數的條件下交換兩個數

如何在不使用第三個變數的條件下交換兩個數

摘要

對於數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;

參考文獻