搜尋此網誌

[C/C++][不透過第三個變數做兩數值交換]

常見的是用第三個變數當暫存器

/*
* File Name: SwapTwoNumber.c
* Author: MH
* Since 2012/09/02
* Toolkit: Dev C++
*/

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){

    int x=1, y=2, z;

    printf("before exchange:\n");
    printf("x=%d, y=%d\n\n", x, y);

    z=x;
    x=y;
    y=z;

    printf("after exchange:\n");
    printf("x=%d, y=%d\n\n", x, y);

    system("PAUSE");
    return 0;
}

不過因為 XOR 具可逆性的關係,因此用兩個變數即可,方法如下:

/*
* File Name: SwapTwoNumber.c
* Author: MH
* Since 2012/09/02
* Toolkit: Dev C++
*/

#include <stdio.h>
#include <stdlib.h>

#define swap(x, y) (x^=y, y^=x, x^=y)    // or swap(x, y) (x^=y^=x^=y)

int main(int argc, char *argv[]){

    int x=1, y=2;

    printf("before exchange:\n");
    printf("x=%d, y=%d\n\n", x, y);

    swap(x, y);

    printf("after exchange:\n");
    printf("x=%d, y=%d\n\n", x, y);

    system("PAUSE");
    return 0;
}

XOR 的 truth table

x y|x XOR y
---+-------
0 0|   0   → 意思就是 x XOR x = 0 或 y XOR y = 0
0 1|   1
1 0|   1
1 1|   0   → 意思就是 x XOR x = 0 或 y XOR y = 0

因此

x = x XOR y(即x^=y)

y = y XOR x(即y^=x)
上面的式子意即
y = y XOR (x XOR y)
= x(因為 y XOR y = 0)

所以此時 x 為 x XOR y,y 裡面是存 x,而最後的式子即是將

x = x XOR y(即x^=y)
= x XOR (x XOR y)
= y(因為 x XOR x = 0)

這樣就互相交換了,是不是很神奇呢?!

沒有留言:

張貼留言