C :: Aufgabe #163
3 Lösungen

Kleine Variablenspielerei
Anfänger - C
von kjaenke
- 03.07.2017 um 15:05 Uhr
Schreibe ein Programm das zwei Zahlen entgegen nimmt und jeweils in eine Variable speichert.
Tausche die Werte der Variablen ohne weitere Variablen zu definieren.
Es sind im ganzen Programm nur die zwei vorher definierten Variablen erlaubt!
Viel Spaß :)
Tausche die Werte der Variablen ohne weitere Variablen zu definieren.
Es sind im ganzen Programm nur die zwei vorher definierten Variablen erlaubt!
Viel Spaß :)
Lösungen:
Konsolenausgabe:
$ ./varswap 1234 5678
Input: a=1234, b=5678, swapped: a=5678, b=1234

/*************************************** * varswap.c Variableninhalte tauschen ***************************************/ #include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { int a, b; if (argc != 3) { printf("Usage: varswap <Zahl 1> <Zahl 2>\n"); return 0; } a = atoi(argv[1]); b = atoi(argv[2]); printf("Input: a=%d, b=%d, swapped: a=%d, b=%d\n", a, b, a^(a^b), b^(a^b)); return 0; }
In meiner Lösung 1 war die Idee gut, aber die Ausführung schlecht, da die Variablen-Zuweisungen fehlen.
Hier die verbesserte Version:
C-Code
Hier die verbesserte Version:

/*************************************** * varswap.c Variableninhalte tauschen ***************************************/ #include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { int a, b; if (argc != 3) { printf("Usage: varswap <Zahl 1> <Zahl 2>\n"); return 0; } a = atoi(argv[1]); b = atoi(argv[2]); printf("Input : a=%d, b=%d\n", a, b); a = a^b; b = b^a; a = b^a; printf("swapped: a=%d, b=%d\n", a, b); return 0; }
Lösung mit Bitshifting:
C-Code
Konsolenausgabe:
$ ./varswap2 2147483647 1234567890
Input : a=2147483647, b=1234567890
swapped: a=1234567890, b=2147483647

/*************************************** * varswap2.c Variableninhalte tauschen ***************************************/ #include <stdlib.h> #include <stdint.h> #include <stdio.h> int main(int argc, char **argv) { int32_t a; int64_t b; if (sizeof(a) == sizeof(b)) { printf("int32 and int64 have same size on this machine.\n"); return 1; } if (argc != 3) { printf("Usage: varswap <Zahl 1> <Zahl 2>\n"); return 0; } a = atoi(argv[1]); b = atoi(argv[2]); printf("Input : a=%d, b=%ld\n", a, b); b = b<<32|a; a = b>>32; b = b&UINT32_MAX; printf("swapped: a=%d, b=%ld\n", a, b); return 0; }