Wie könnte man die swap() Funktion einfacher gestalten?



  • hustbaer schrieb:

    hihi ja die XOR geschichte. vollkommen uninteressant heutzutage, und trotzdem fragen es sogar z.t. leute beim vorstellungsgespräch.

    Vorstellungsgespräch für was?

    hustbaer schrieb:

    was ich aber eigentlich sagen wollte: wenn ich prüfer wäre, und einer meiner prüflinge würde das mit zeigern machen, dann würde ich ihm gleich mal hübsch 0 punkte auf das beispiel geben.
    ist nämlich UB.
    grund: du darfst keine werte in zeiger-variablen laden, die kein gültiger zeiger sind.

    Er benutzt die Zeiger als Zeiger. Das ist schon in Ordnung.



  • Z schrieb:

    hustbaer schrieb:

    hihi ja die XOR geschichte. vollkommen uninteressant heutzutage, und trotzdem fragen es sogar z.t. leute beim vorstellungsgespräch.

    Vorstellungsgespräch für was?

    Programmierer-Jobs.

    hustbaer schrieb:

    was ich aber eigentlich sagen wollte: wenn ich prüfer wäre, und einer meiner prüflinge würde das mit zeigern machen, dann würde ich ihm gleich mal hübsch 0 punkte auf das beispiel geben.
    ist nämlich UB.
    grund: du darfst keine werte in zeiger-variablen laden, die kein gültiger zeiger sind.

    Er benutzt die Zeiger als Zeiger. Das ist schon in Ordnung.

    Was der OP macht ist vollkommen OK, sorry falls das falsch rüberkam.

    Ich meinte wenn einer einen XOR-Tausch mit Zeigern machen würde.
    Mal ganz davon abgesehen dass man dazu sowieso wild rumcasten müsste, da ^ ja nicht auf Zeiger definiert ist.

    Und was die Speed angeht: bei CISC CPUs kannst du oft XOR direkt memory/memory machen. Damit brauchst du nur 3x XOR und kein einziges MOV. Auf einem RISC wäre ein XOR Tausch dagegen vollkommen sinnlos, wenn die Werte im Speicher stehen. XOR Tausch verwendet man aber eher wenn die Werte im Register stehen, und man keines pushen/poppen will.



  • hustbaer schrieb:

    Z schrieb:

    hustbaer schrieb:

    hihi ja die XOR geschichte. vollkommen uninteressant heutzutage, und trotzdem fragen es sogar z.t. leute beim vorstellungsgespräch.

    Vorstellungsgespräch für was?

    Programmierer-Jobs.

    Wohl als Assembler-Programmierer 😃

    hustbaer schrieb:

    Und was die Speed angeht: bei CISC CPUs kannst du oft XOR direkt memory/memory machen. Damit brauchst du nur 3x XOR und kein einziges MOV. Auf einem RISC wäre ein XOR Tausch dagegen vollkommen sinnlos...

    Sehe ich ähnlich, deshalb ist der XOR-Tausch fast immer sinnlos. Ausser man möchte die temporäre Variable sparen.



  • Z schrieb:

    hustbaer schrieb:

    Z schrieb:

    hustbaer schrieb:

    hihi ja die XOR geschichte. vollkommen uninteressant heutzutage, und trotzdem fragen es sogar z.t. leute beim vorstellungsgespräch.

    Vorstellungsgespräch für was?

    Programmierer-Jobs.

    Wohl als Assembler-Programmierer 😃

    Nö, das ist ja das krasse! Hab den Link leider nimmer im Kopf, aber das waren schon Hochsprachen-Jobs.

    hustbaer schrieb:

    Und was die Speed angeht: bei CISC CPUs kannst du oft XOR direkt memory/memory machen. Damit brauchst du nur 3x XOR und kein einziges MOV. Auf einem RISC wäre ein XOR Tausch dagegen vollkommen sinnlos...

    Sehe ich ähnlich, deshalb ist der XOR-Tausch fast immer sinnlos. Ausser man möchte die temporäre Variable sparen.

    Naja, weshalb sollte man die temporäre Variable sparen wollen? Kostet ja nix.



  • Z schrieb:

    unskilled schrieb:

    es gibt noch einen weg über 3 xor`s (ist also ca.(ganz genau?)

    Etwa so

    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
    

    was passiert wenn *a==*b 😕 das sollte evtl. vorher mal geklärt werden denn sonst hast nen bug der so gut wie unsichtbar ist 😉

    lg lolo



  • noobLolo schrieb:

    Z schrieb:

    unskilled schrieb:

    es gibt noch einen weg über 3 xor`s (ist also ca.(ganz genau?)

    Etwa so

    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
    

    was passiert wenn *a==*b 😕 das sollte evtl. vorher mal geklärt werden denn sonst hast nen bug der so gut wie unsichtbar ist 😉
    lg lolo

    Was soll dabei passieren?



  • Z schrieb:

    Was soll dabei passieren?

    mach ein proggie compilier das und schau nach, das nennt sich dann learning by doing 😉



  • noobLolo schrieb:

    Z schrieb:

    Was soll dabei passieren?

    mach ein proggie compilier das und schau nach, das nennt sich dann learning by doing 😉

    Also schriftlich, beide 1

    a=1, b =1
    a = 1 xor 1 = 0
    b = 0 xor 1 = 1
    a = 0 xor 1 = 1
    

    beide 0

    a=0, b=0
    a = 0 xor 0 = 0
    b = 0 xor 0 = 0
    a = 0 xor 0 = 0
    

    Geht doch, oder ist da ein Fehler drin? 😕



  • noobLolo schrieb:

    Z schrieb:

    Was soll dabei passieren?

    mach ein proggie compilier das und schau nach, das nennt sich dann learning by doing 😉

    Du meinst also so?:

    void swap(int &*a, int &*b)
    {
        if(a!=b && &*a!=&*b)
        {
            *a = *a ^ *b;
            *b = *a ^ *b;
            *a = *a ^ *b;
        }
    }
    

    Sieht für mich ein bisschen paranoid aus...



  • asdfasd schrieb:

    ...Sieht für mich ein bisschen paranoid aus...

    ja wir haben schon rausgefunden, daß heut iwie nicht mein tag ist.
    also, um das evtl. aufzuklären, der xor-swap funktioniert auch ohne.
    der algo welcher mir in erinnerung war zu finden unter http://en.wikipedia.org/wiki/XOR_swap_algorithm arbeitete mit zeigern, und es sollten nicht die werte verschieden sein sondern die speicher adressen... 😞

    lg lolo


Anmelden zum Antworten