다른 임시 변수에 어떤 이유로 든 공간을 할당하지 않으려면 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;"의 문제를 이해하십시오. 이를 수정 한 다음 두 변수 이상을 회전하도록 확장합니다. –