4月 06, 2020 Programming
在大多數的情況下,如果需要對調兩個變數的值,就需要使用到第三個變數來記錄暫存的值 :

```js
temp = x;
x = y;
y = temp;
```

然而,其實是可以使用 XOR 來耍點技巧來達成,不需要使用到 temp 變數 :

```js
x = x xor y;
y = x xor y;
x = x xor y;
```

不相信 ? 以下會進行一個實際的例子。

```js
// init values
var x = 34; // 34
var y = 78; // 78

// do the swap
x = x xor y; // 108
y = x xor y; // 34
x = x xor y; // 78

// final values
y; // 34
x; // 78
```

### 什麼是 XOR

XOR 是對 bit 的運算,以下例子可以說明 XOR 的動作 :

|x|y|x xor y|
|---|
|0|0|0|
|0|1|1|
|1|0|1|
|1|1|0|

### 動作分析

我們把上面的操作,使用不同的變數儲存起來,就會比較容易看得出分別。

```js
x1 = x xor y
y1 = x1 xor y
x2 = x1 xor y1
```

使用上面的數字 ( x = 34, y = 78 ),我們使用二進為計算一下。

#### 第一步

```js
x1 = x xor y
```

我們使用二進位來計算說明 :

|||||||||
|---|
|||1|0|0|0|1|0|
|xor|1|0|0|1|1|1|0|
||1|1|0|1|1|0|0|

而二進位 1101100 就是十進位的 108。

#### 第二步

```js
y1 = x1 xor y
```

我們使用二進位來計算說明 :

|||||||||
|---|
||1|1|0|1|1|0|0|
|xor|1|0|0|1|1|1|0|
||0|1|0|0|0|1|0|

而二進位 100010 就是十進位的 34,已經把 x 的值移到 y 去了。

#### 最後一步

```js
x2 = x1 xor y1
```

我們使用二進位來計算說明 :

|||||||||
|---|
||1|1|0|1|1|0|0|
|xor||1|0|0|0|1|0|
||1|0|0|1|1|1|0|

而二進位 1001110 就是十進位的 78,已經把 y 的值移到 x 去了。

這樣就已經完成把變數 x 和 y 互換了 !

### 使用純數的角度去證明

以下是證明 x2 = y 的算式 :

```js
x2 = x1 xor y1;
x2 = x1 xor (x1 xor y); // replace y1
x2 = (x1 xor x1) xor y; // associative law
x2 = 0 xor y; // a xor a => 0
x2 = y; // 0 xor a => a; x2 now has y's original value
```

以下是證明 y1 = x 的算式 :

```js
y1 = x1 xor y
y1 = (x xor y) xor y
y1 = x xor (y xor y)
y1 = x xor 0
y1 = x
```

很有趣吧 !
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)