不使用臨時變數交換兩個變數的值(異或,加減,乘除)

2021-07-03 02:28:36 字數 1482 閱讀 6352

一般我們交換兩個變數的值的時候,一般會用到乙個輔助變數,像這樣

int temp = a;

a = b;

b = temp;

當然,也有一些指令碼語言如python,lua只需要一行**就搞定

a,b = b,a
除了使用輔助變數之外,我們還可以通過其他方法來達到交換的目的。

異或有一些有趣的用法,比如這裡有用異或的性質求出陣列內乙個唯一乙個只出現一次的元素的例子。

使用異或就不要乙個額外的輔助變數了。

a = a^b;

b = a^b;

a = a^b;

我們來看一下真值表就知道這確實能達到交換值的目的了ab

abab

ab原始值000

1101

1a = a^b00

1110

01b = a^b00

1011

01a = a^b00

1001

11每一位上都發生了交換,兩個變數的值自然也就發生了交換

但是,這個方法在特定情況下會有問題。當要交換的兩個變數其實是同乙個變數的時候,結果就不對。

考慮如下**:

int arr = ;

int i = 0;

int j = 0;

arr[i] = arr[i] ^ arr[j];

arr[j] = arr[i] ^ arr[j];

arr[i] = arr[i] ^ arr[j];

system.out.println(arr[i]);

system.out.println(arr[j]);

輸出為

0

0

void twiddle1(int *xp, int *yp)

void twiddle2(int *xp, int *yp)

這兩個方法的行為貌似是一樣的,其實不一定。當指標xp和yp指向同乙個位置的時候twiddle1把xp指向位置上的值變為了原來的四倍,twiddle2把xp指向位置上的值變為了原來的三倍。

a = a + b;

b = a - b;

a = a - b;

其實可以看成a = a + b - a, b = a + b - b

這種方法看起來可能會有溢位的問題,但其實試一下就會發現就算a+b大於integer.max_value,出現了溢位,最後的結果還是成功交換了。

a = a * b;

b = a / b;

a = a / b;

不使用臨時變數交換兩個整數變數

先看一下交換變數的常規方式 public static void swap1 輸出 i 1,j 5 i 5,j 1使用臨時變數儲存一下其中乙個值,這種方法所有人都知道,且可以交換任何變數。如果是int或者long等整數變數,還可以通過以下方式交換 public static void swap2 輸...

不使用其他變數,交換兩個變數的值

不使用其他變數,交換兩個變數的值。方法壹。因為異或運算滿足交換律和結合律,且 a a 0,0 a a,所以用下面過程可以交換 a,b 用 a,b 表示原始的 a,b 值 1 a a b 2 b a b b a b a b b a b b a 0 a 3 a a b a a b a b a b a a...

不用臨時變數,交換兩個變數的值

在學習c語言的時候,涉及到兩個變數值的交換,其中用到臨時變數。類似於 temp a a b b temp 這樣的語句,如果在沒有臨時變數的情況下,該如何做呢?網路上的人們給出了兩種方法 一 異或法 a a b b b a a a b 二 加減法 a a b b a b a a b 其實我們看加減法更...