Zahlen ohne Verwendung von logischen Operatoren sortieren?!


  • Mod

    das ist nicht immer richtig richtig: wenn z.b. a<0 und b>0 und a-b zum überlauf führen würde, dann würde trotzdem a als maximum zurückgegeben werden, wenn der mögliche wertebereich kleiner ist, kann man es nat. so machen - auf assembler ebene geht es im übrigen einfacher (ab pentium pro - maximum):

    inline int Maximum(const int a, const int b)
    {
        __asm
        {
            mov    eax, a
            cmp    eax, b
            cmovl  eax, b
    }
    

    da es sich um keinen sprung handelt, muss im falle falscher vorhersage nicht die ganze pipeline gelöscht werden, lediglich alle ergebnisse die auf dem cmov beruhen müssen verworfen werden; insofern ist diese variante sehr schnell, insbes. wenn das ergebnis nicht gleich im nächsten befehl benötigt wird.
    im übrigen bin ich nicht sicher ob das überhaupt portabel ist: nähmlich das shift auf jeder maschine arihmetisch und nicht logisch arbeitet (bei logisch könnte man & mit * ersetzen). jemand mit ahnung vom standard kann das sicher besser beurteilen. 🙂

    @MaSTaH: wieso ich? war doch nicht meine idee 😉
    klar, beim bubblesort braucht man ja irgendwie eine abbruchbedingung, insofern ist dann wenigstens einmal ein logischer ausdruck notwendig (oder man nimmt immer die maximale anzahl von durchläufen: bei n elementen (n-1)(n-2)/2 lol)


Anmelden zum Antworten