Zwei Bytes eines Integers tauschen
-
Hi @ All.
Hey Storm.Xapek.de, Deine Lösung ist schonmal nicht schlecht. Ist allerdings mit shift-Operatoren...
Ja, das hab ich hier auf einem Aufgabenblatt. Soll allerdings nicht mit shift-Operatoren arbeiten die Funktion...
Und genau DA fällt mir nichts einGruß an alle.
Chris
-
int tauschebytes(int *zahl, int bytepos1, int bytepos2){ unsigned char *ptr = (unsigned char *)zahl; unsigned char temp = ptr[bytepos1]; ptr[bytepos1] = ptr[bytepos2]; ptr[bytepos2] = temp; return *zahl; }
Sicherheitschecks sind da aber keine drin.
-
Spitze!
Hab vorhin auch überlegt, dass man es casten könnte und dann als Array beahndeln könnte!
Hier hast Du die Lösung. Finds super!!
Danke.Chris
-
Also wenn man mal annehmen darf sizeof(char) = 1
Und - wie mein Vorgänger bereits - noch einige Dummheiten ausschließt, die doch eh kein benutzer eingibt :D:D;)Das return kann man sich eh schenken...
Wer wird schon sein Ergebnis direkt weiterverwenden... eben!void tauschebytes0(int *i, int p1, int p2) { char *ptr = (char *)i; ptr[p1] ^= ptr[p2]; ptr[p2] ^= ptr[p1]; ptr[p1] ^= ptr[p2]; }
Wir wollen ja kostbaren Speicherplatz sparen!!!
Natürlich ist es seeeehr wichtig zeilen zu sparen Also:
void tauschebytes1(int *i, int p1, int p2) { ((char *)i)[p1] ^= ((char *)i)[p2]; ((char *)i)[p2] ^= ((char *)i)[p1]; ((char *)i)[p1] ^= ((char *)i)[p2]; }
Natürlich ist ein Dreizeiler völlig inakzeptabel
void tauschebytes2(int *i, int p1, int p2) { char *ptr = (char *)i; ptr[p1] ^= (ptr[p2] ^= (ptr[p1] ^= ptr[p2])); }
Oder vielleicht doch gleich:
void tauschebytes3(int *i, int p1, int p2) { ((char *)i)[p1] ^= (((char *)i)[p2] ^= (((char*)i)[p1] ^= ((char*)i)[p2])); }
???
Und jetzt komm mir keiner das kann man nicht lesen
Hier geht's nich um lesbar, hier geht's um knall harte Noten (Hoff ich doch zumindest)Und mal im Ernst: Das ist nicht schneller als die erste Lösung. Swappen mittels XOR bringt auf Grund von "parallelen" Pipelines eh nix, aber eine hübsche Spielerei ist es trotzdem!
-
nirsaja schrieb:
Also wenn man mal annehmen darf sizeof(char) = 1
Ja, darf man.
void tauschebytes2(int *i, int p1, int p2) { char *ptr = (char *)i; ptr[p1] ^= (ptr[p2] ^= (ptr[p1] ^= ptr[p2])); }
Das darf man hingegen nicht. http://www2.informatik.uni-wuerzburg.de/dclc-faq/kap6.html
-
Weil?
-
Weil undefiniertes Verhalten. Eine Variable darf pro Ausdruck nur einmal modifiziert werden.
-
nirsaja schrieb:
Das return kann man sich eh schenken...
Wer wird schon sein Ergebnis direkt weiterverwendenZB ich. Deshalb würde mein Funktionskopf auch eher wie folgt aussehen:
int tauschebytes(int zahl, int bytepos1, int bytepos2)
Damit ist man einfach flexibler.
-
Das war ja sooo klar, dass es jetzt wieder Leute gibt, die meinen sie müssten hier für Flexibilität und Co eintreten und viel komfortablere Lösungen vorschlagen.
Echt... find ich voll
-
Spätestens dann, wenn du das Ergebnis für eine Initialisierung oder Verknüpfung brauchst, wirst du für diese Lösung aber dankbar sein. Ob dir das nun gefällt oder nicht...