Swap-Funktion in C implementieren
- Temporäre Variable verwenden, um die Swap-Funktion in C zu implementieren
- Verwenden von arithmetischen Operationen zur Implementierung der Swap-Funktion in C
- Bitweise XOR-Operation zur Implementierung der Swap-Funktion in C verwenden
- Bitweise XOR-Operation und Makros zur Implementierung der Swap-Funktion in C verwenden
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);
}
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