Implementar la función de intercambio en C

Jinku Hu 12 octubre 2023
  1. Utilice una variable temporal para implementar la función de intercambio en C
  2. Utilice operaciones aritméticas para implementar la función de intercambio en C
  3. Utilice la operación XOR bit a bit para implementar la función de intercambio en C
  4. Utilice la operación XOR bit a bit y las macros para implementar la función de intercambio en C
Implementar la función de intercambio en C

Este artículo explicará varios métodos de cómo implementar la función de intercambio en C.

Utilice una variable temporal para implementar la función de intercambio en C

La función de intercambio es una operación típica que se realiza sobre variables. No hay una función de biblioteca estándar de C que proporcione la característica como C++ tiene la función std::swap. En este artículo, implementamos funciones de intercambio para valores integrales; es decir, la mayoría de ellos toman argumentos de tipo long int, pero siempre se pueden definir múltiples prototipos para diferentes tipos y asegurar características genéricas usando macro expansiones. El siguiente ejemplo demuestra la función de intercambio utilizando la variable temporal. Tenga en cuenta que, aunque es la implementación más fácil, esta es relativamente la versión más rápida entre las que se enumeran a continuación (cuando se utilizan las optimizaciones del compilador).

#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);
}

Comando de muestra:

./program 123 432

Producción :

x:123, y:432
x:432, y:123

Utilice operaciones aritméticas para implementar la función de intercambio en C

Alternativamente, se puede implementar una función de intercambio usando solo operaciones de suma y resta. Operamos con punteros pasados ​​en la función, por lo tanto, modificamos los valores de los argumentos directamente. En la función main, hay una condición if antes de que se llame a la función swap para evitar la invocación cuando los operandos son iguales.

#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);
}

Utilice la operación XOR bit a bit para implementar la función de intercambio en C

La implementación más complicada y un poco complicada de la función de intercambio es donde se usa la operación XOR bit a bit. Tenga en cuenta que esta versión no necesita una tercera variable como el ejemplo anterior. Al principio, almacenamos el resultado XOR-ed de los enteros dados en uno de sus lugares. Luego, XOR el valor almacenado (y) con el otro entero y almacenamos el resultado en el lugar de este último. Finalmente, ambas variables se XOR-ed una vez más, y el resultado se almacena en la primera variable modificada - y en este caso. Esta implementación involucra más instrucciones de código de máquina cuando se compila sin indicadores de optimización, por lo tanto, produce una solución más intensiva en computación.

#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);
}

Utilice la operación XOR bit a bit y las macros para implementar la función de intercambio en C

Como se demostró en el ejemplo anterior, la función de intercambio XOR también se puede implementar como una macro de función. Tenga en cuenta que debe comprobarse si los dos operandos son el mismo objeto; de lo contrario, la macro asigna cero al objeto, lo que da como resultado una salida errónea. Esta verificación se implementa usando el condicional ?:, Y solo entonces ejecutamos el algoritmo de intercambio XOR similar a la implementación anterior. Sin embargo, tenga en cuenta que esta macro similar a una función solo puede procesar valores integrales.

#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);
}
Autor: 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