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 ein 😞

    Gruß 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 weiterverwenden

    ZB ich. Deshalb würde mein Funktionskopf auch eher wie folgt aussehen:

    int tauschebytes(int zahl, int bytepos1, int bytepos2)
    

    Damit ist man einfach flexibler.



  • @groovemaster

    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...


Anmelden zum Antworten