C에서 스왑 기능 구현
- 임시 변수를 사용하여 C에서 스왑 기능 구현
- 산술 연산을 사용하여 C에서 스왑 함수 구현
- Bitwise XOR 연산을 사용하여 C에서 스왑 기능 구현
- Bitwise XOR 연산 및 매크로를 사용하여 C에서 스왑 기능 구현
이 기사에서는 C에서 스왑 기능을 구현하는 방법에 대한 몇 가지 방법을 설명합니다.
임시 변수를 사용하여 C에서 스왑 기능 구현
스왑 기능은 변수에 대해 수행하는 일반적인 작업입니다. C++과 같은 기능을 제공하는 C 표준 라이브러리 함수에는std::swap
기능이 있습니다. 이 기사에서는 정수 값에 대한 스왑 함수를 구현합니다. 즉, 대부분은long int
유형 인수를 사용하지만 항상 다른 유형에 대해 여러 프로토 타입을 정의하고 매크로 확장을 사용하여 일반 기능을 보장 할 수 있습니다. 다음 예제는 임시 변수를 사용하는 스왑 기능을 보여줍니다. 가장 쉬운 구현 임에도 불구하고이 버전은 아래 나열된 다른 버전 중에서 상대적으로 가장 빠른 버전입니다 (컴파일러 최적화가 사용되는 경우).
#include <stdio.h>
#include <stdlib.h>
void swap(long *x, long *y) {
long tmp = *x;
*x = *y;
*y = tmp;
}
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program first_number second_number/n");
return 1;
}
long x = strtol(argv[1], NULL, 0);
long y = strtol(argv[2], NULL, 0);
printf("x:%ld, y:%ld\n", x, y);
if (x != y) swap(&x, &y);
printf("x:%ld, y:%ld\n\n", x, y);
exit(EXIT_SUCCESS);
}
샘플 명령:
./program 123 432
출력:
x:123, y:432
x:432, y:123
산술 연산을 사용하여 C에서 스왑 함수 구현
또는 더하기 및 빼기 연산 만 사용하여 스왑 기능을 구현할 수 있습니다. 함수에서 전달 된 포인터에 대해 작업하므로 인수 값을 직접 수정합니다. main
함수에는 피연산자가 같을 때 호출을 피하기 위해swap
함수가 호출되기 전에if
조건이 있습니다.
#include <stdio.h>
#include <stdlib.h>
void swap(long *x, long *y) {
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program first_number second_number/n");
return 1;
}
long x = strtol(argv[1], NULL, 0);
long y = strtol(argv[2], NULL, 0);
printf("x:%ld, y:%ld\n", x, y);
if (x != y) swap(&x, &y);
printf("x:%ld, y:%ld\n\n", x, y);
exit(EXIT_SUCCESS);
}
Bitwise XOR 연산을 사용하여 C에서 스왑 기능 구현
스왑 함수의 가장 까다 롭고 약간 복잡한 구현은 비트 XOR 연산이 사용되는 곳입니다. 이 버전에는 이전 예제와 같은 세 번째 변수가 필요하지 않습니다. 처음에는 주어진 정수의 XOR 결과를 해당 위치 중 하나에 저장합니다. 그런 다음 저장된 값 (y
)을 다른 정수와 XOR하고 결과를 후자의 자리에 저장합니다. 마지막으로 두 변수는 한 번 더 XOR 처리되고 결과는 첫 번째로 수정 된 변수 인y
에 저장됩니다. 이 구현은 최적화 플래그없이 컴파일 될 때 더 많은 기계 코드 명령을 포함하므로 더 계산 집약적 인 솔루션을 생성합니다.
#include <stdio.h>
#include <stdlib.h>
void swap(long *x, long *y) {
*y = *x ^ *y;
*x = *x ^ *y;
*y = *x ^ *y;
}
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program first_number second_number/n");
return 1;
}
long x = strtol(argv[1], NULL, 0);
long y = strtol(argv[2], NULL, 0);
printf("x:%ld, y:%ld\n", x, y);
if (x != y) swap(&x, &y);
printf("x:%ld, y:%ld\n\n", x, y);
exit(EXIT_SUCCESS);
}
Bitwise XOR 연산 및 매크로를 사용하여 C에서 스왑 기능 구현
이전 예에서 설명한 것처럼 XOR 스왑 기능은 함수와 유사한 매크로로 구현할 수도 있습니다. 두 피연산자가 동일한 객체인지 확인해야합니다. 그렇지 않으면 매크로가 개체에 0을 할당하므로 잘못된 출력이 발생합니다. 이 검사는? :
조건을 사용하여 구현되며, 그런 다음 이전 구현과 유사한 XOR 스왑 알고리즘을 실행합니다. 하지만이 함수와 유사한 매크로는 정수 값만 처리 할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
#define XORSWAP(a, b) \
((&(a) == &(b)) ? (a) : ((a) ^= (b), (b) ^= (a), (a) ^= (b)))
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program first_number second_number/n");
return 1;
}
long x = strtol(argv[1], NULL, 0);
long y = strtol(argv[2], NULL, 0);
printf("x:%ld, y:%ld\n", x, y);
XORSWAP(x, y);
printf("x:%ld, y:%ld\n", x, y);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook