Array Elemente vertauschen



  • oenone schrieb:

    oder per xor ohne temporäre variable, falls du speicher sparen willst 😛

    Das klappt aber nicht für alle Typen.

    Gruß Alex



  • Alex_H schrieb:

    oenone schrieb:

    oder per xor ohne temporäre variable, falls du speicher sparen willst 😛

    Das klappt aber nicht für alle Typen.

    Gruß Alex

    Aber für alle für die es einen gleichgroßen Integertyp gibt. O.K. das wird dann böses gebastel, aber es geht. Schneller dürfte wohl eh die kopiererei sein.



  • Alex_H schrieb:

    oenone schrieb:

    oder per xor ohne temporäre variable, falls du speicher sparen willst 😛

    Das klappt aber nicht für alle Typen.

    Gruß Alex

    was speicherst du schon in arrays? integer, char, pointer... für anderes machts nicht viel sinn, da du hier lieber mit pointer arbeitest um speicher zu sparen.

    auf bald
    oenone



  • Nur aus Neugier, wie würde das z.B. für zwei float aussehen?

    Gruß Alex

    @TactX
    <klugscheiß> Wenn ich es erst in einen anderen Typ umwandle, geht es nicht für alle Typen </klugscheiß>



  • ja, gut.. bei fließkommazahlen wirds problematisch.

    auf bald
    oenone



  • ähm neee, bei gleichen basistypen gehts prima.

    float a = 20, b = 70;
    printf("a = %f, b = %f\n", a, b);
    a ^= b;
    b ^= a;
    a ^= b;
    printf("a = %f, b = %f\n", a, b);
    

    es geht auch "a ^= b ^= a ^= b;" *g*

    sorry, muss mich korrigieren. der compiler lässt das nicht zu

    dafür aber das 😛
    (nur für 32bit große datentypen)

    #define SWAPL(a,b) (*(long*)(&a) ^= *(long*)(&b) ^= *(long*)(&a) ^= *(long*)(&b))
    
    float a = 20.7, b = 70.2;
    printf("a = %f, b = %f\n", a, b);
    SWAPL(a,b);
    printf("a = %f, b = %f\n", a, b);
    


  • c.rackwitz schrieb:

    ähm neee, bei gleichen basistypen gehts prima.

    float a = 20, b = 70;
    printf("a = %f, b = %f\n", a, b);
    a ^= b;
    b ^= a;
    a ^= b;
    printf("a = %f, b = %f\n", a, b);
    

    es geht auch "a ^= b ^= a ^= b;" *g*

    sorry, muss mich korrigieren. der compiler lässt das nicht zu

    Ähmm, ja... geht wunderbar 🙄

    So geht's schon:

    float a,b;
    a = 3.14;
    b = 0.01;
    
    *(int *)&a ^= *(int *)&b;
    *(int *)&b ^= *(int *)&a;
    *(int *)&a ^= *(int *)&b;
    


  • TactX schrieb:

    c.rackwitz schrieb:

    ...
    sorry, muss mich korrigieren. der compiler lässt das nicht zu

    Ähmm, ja... geht wunderbar 🙄

    So geht's schon:
    ...

    ich hab doch gesagt, dass ich mich korrigieren musste, dass der compiler das nicht zulässt und dann hab ich noch nen edit gemacht, weil ich es mit einem macro hinbekommen hab...
    🙄



  • c.rackwitz schrieb:

    ich hab doch gesagt, dass ich mich korrigieren musste, dass der compiler das nicht zulässt und dann hab ich noch nen edit gemacht, weil ich es mit einem macro hinbekommen hab...
    🙄

    Sorry, das hätte ich natürlich wissen müssen. Vor allem weil dein edit _nach_ meinem Beitrag da war 🙄 🙄 🙄



  • ...
    aber nicht der erste edit, wo ich bereits gesagt hatte, dass es nicht funktioniert. hast mich sogar zitiert und es einfach überlesen... gratuliere.



  • Ups, stimmt. Hab ich echt übersehen. Peinlich 🙄


Anmelden zum Antworten