Swap-Funktion in C implementieren

Jinku Hu 12 Oktober 2023
  1. Temporäre Variable verwenden, um die Swap-Funktion in C zu implementieren
  2. Verwenden von arithmetischen Operationen zur Implementierung der Swap-Funktion in C
  3. Bitweise XOR-Operation zur Implementierung der Swap-Funktion in C verwenden
  4. Bitweise XOR-Operation und Makros zur Implementierung der Swap-Funktion in C verwenden
Swap-Funktion in C implementieren

In diesem Artikel werden verschiedene Methoden erläutert, wie die Swap-Funktion in C implementiert werden kann.

Temporäre Variable verwenden, um die Swap-Funktion in C zu implementieren

Die Swap-Funktion ist eine typische Operation, die auf Variablen ausgeführt wird. Es gibt keine Funktion in der C-Standardbibliothek, die diese Funktion zur Verfügung stellt, so wie C++ die Funktion std::swap hat. In diesem Artikel implementieren wir Swap-Funktionen für ganzzahlige Werte, d. h. die meisten von ihnen nehmen Argumente vom Typ long int, aber man kann immer mehrere Prototypen für verschiedene Typen definieren und mit Makroerweiterungen generische Eigenschaften sicherstellen. Das folgende Beispiel demonstriert die Swap-Funktion unter Verwendung der temporären Variablen. Beachten Sie, dass dies, obwohl es die einfachste Implementierung ist, die relativ schnellste Version unter den anderen unten aufgeführten ist (wenn die Compiler-Optimierungen verwendet werden).

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

Beispiel-Befehl:

./program 123 432

Ausgabe:

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

Verwenden von arithmetischen Operationen zur Implementierung der Swap-Funktion in C

Alternativ kann man eine Swap-Funktion auch nur mit Additions- und Subtraktionsoperationen implementieren. Wir operieren in der Funktion auf übergebenen Zeigern, verändern also direkt die Argumentwerte. In der main-Funktion gibt es eine if-Bedingung, bevor die swap-Funktion aufgerufen wird, um den Aufruf zu vermeiden, wenn die Operanden gleich sind.

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

Bitweise XOR-Operation zur Implementierung der Swap-Funktion in C verwenden

Die trickreichste und etwas komplizierte Implementierung der Swap-Funktion ist die, bei der die bitweise XOR-Operation verwendet wird. Beachten Sie, dass diese Version keine dritte Variable wie im vorherigen Beispiel benötigt. Zunächst speichern wir das XOR-verknüpfte Ergebnis der gegebenen Ganzzahlen an einer ihrer Stellen. Dann wird der gespeicherte Wert (y) mit der anderen Ganzzahl XOR-verknüpft und das Ergebnis an der Stelle der anderen Ganzzahl gespeichert. Zum Schluss werden beide Variablen noch einmal XOR-ed und das Ergebnis wird in der zuerst modifizierten Variable - in diesem Fall y - gespeichert. Diese Implementierung beinhaltet mehr Maschinencode-Anweisungen, wenn sie ohne Optimierungsflags kompiliert wird, und führt daher zu einer rechenintensiveren Lösung.

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

Bitweise XOR-Operation und Makros zur Implementierung der Swap-Funktion in C verwenden

Wie im vorherigen Beispiel gezeigt, kann die XOR-Tauschfunktion auch als funktionsähnliches Makro implementiert werden. Beachten Sie, dass es eine Prüfung geben muss, ob die beiden Operanden das gleiche Objekt sind; andernfalls weist das Makro dem Objekt Null zu, was zu der fehlerhaften Ausgabe führt. Diese Prüfung wird mit der Bedingung ?: implementiert, und erst dann führen wir den XOR-Swap-Algorithmus ähnlich wie bei der vorherigen Implementierung aus. Beachten Sie aber, dass dieses funktionsähnliche Makro nur ganzzahlige Werte verarbeiten kann.

#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