如果您不想为另一个临时变量(无论出于何种原因)分配空间,则可以使用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;”中的问题并修复它,然后扩展它来旋转超过两个变量。 –