如果您不想爲另一個臨時變量(無論出於何種原因)分配空間,則可以使用XOR運算符交換/旋轉值。 XOR運算符有時稱爲parity function。這比實際應用更有趣。下面代碼中的rotate_left
函數只使用3個變量,但該原理可應用於任意數量的變量(請參閱rotate_right
函數以瞭解變量順序如何影響輸出)。
#include <stdio.h>
void number_swap(int* a, int* b) {
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
void rotate_left(int* a, int* b, int* c) {
*a ^= *b^*c;
*c ^= *a^*b;
*b ^= *a^*c;
*a ^= *b^*c;
}
void rotate_right(int* a, int* b, int* c, int* d) {
*a ^= *b^*c^*d;
*b ^= *a^*c^*d;
*c ^= *a^*b^*d;
*d ^= *a^*b^*c;
*a ^= *b^*c^*d;
}
int main() {
int a = 7894;
int b = 1989;
printf("a = %d, b = %d\n", a, b);
number_swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
int aa = 5;
int bb = 8;
int cc = 3;
printf("aa = %d, bb = %d, cc = %d\n", aa, bb, cc);
rotate_left(&aa, &bb, &cc);
printf("aa = %d, bb = %d, cc = %d\n", aa, bb, cc);
int aaa = 1;
int bbb = 3;
int ccc = 5;
int ddd = 7;
printf("aaa = %d, bbb = %d, ccc = %d, ddd = %d\n", aaa, bbb, ccc, ddd);
rotate_right(&aaa, &bbb, &ccc, &ddd);
printf("aaa = %d, bbb = %d, ccc = %d, ddd = %d\n", aaa, bbb, ccc, ddd);
return 0;
}
這將產生以下的輸出:
a = 7894, b = 1989
a = 1989, b = 7894
aa = 5, bb = 8, cc = 3
aa = 8, bb = 3, cc = 5
aaa = 1, bbb = 3, ccc = 5, ddd = 7
aaa = 7, bbb = 1, ccc = 3, ddd = 5
您可以運行這個例子here。
你可以閱讀更多關於爲什麼XOR交換算法工作here。
這應該不會太難。你嘗試了什麼?來吧!不要指望我們爲你做你的工作。你基本上列出了代碼,但用英文表示... – unwind
對我來說這很難,我只是一個初學者。C。 – Teuntje
問題不是語言特定的,它是在算法級別。您需要找出一種算法,可以將這些值移入不同的變量,而不會丟失其中一個原始值。理解「a = b; b = a;」中的問題並修復它,然後擴展它來旋轉超過兩個變量。 –