C에서 스왑 기능 구현

Jinku Hu 2023년10월12일
  1. 임시 변수를 사용하여 C에서 스왑 기능 구현
  2. 산술 연산을 사용하여 C에서 스왑 함수 구현
  3. Bitwise XOR 연산을 사용하여 C에서 스왑 기능 구현
  4. Bitwise XOR 연산 및 매크로를 사용하여 C에서 스왑 기능 구현
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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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