kleine frage zu (modulo) division



  • hi,

    ich kenn mich in assembler nur ein bischen aus. aber ich habe mich gefragt ob man eine divsion folgender form optimieren kann:

    int x = 42;
    int a = x / 10;
    int b = x % 10;
    

    ich habe festgestellt, dass der compiler das in 2 divisionen umrechnet, und mich gefragt, ob das nicht besser zu machen geht - mit assembler.

    <EDIT>hatte hier noch ein programm zur veranschaulichung und den umgerechneten assembler code, aber das erschlägt bestimmt. deshalb hab ichs raus genommen.</EDIT>

    danke im vor*aus
    lw



  • Lawilog schrieb:

    ich kenn mich in assembler nur ein bischen aus. aber ich habe mich gefragt ob man eine divsion folgender form optimieren kann:

    int x = 42;
    int a = x / 10;
    int b = x % 10;
    

    ich weiss jetzt nicht ob x/10 irgendwie mit 'bit-banging' geht aber b=x%10 kannste als b=x-a schreiben.


  • Mod

    1. quellcode optimieren
    2. compiler optimierung EINSCHALTEN
    3. wiederkommen
    ... 😉



  • net schrieb:

    int x = 42;
    int a = x / 10;
    int b = x % 10;
    

    =>
    x = 42;
    a = 42 / 10 = 4;
    b = 42 % 10 = 2;

    net schrieb:

    aber b=x%10 kannste als b=x-a schreiben.

    b = x - a => b = 42 - 4 = 38 😕

    Korrekter wär' wohl b = x - ( a * 10 ) 💡



  • 1. quellcode optimieren
    2. compiler optimierung EINSCHALTEN
    3. wiederkommen

    das hab ich auch schon versucht. " 😉 " hat aber nix gebracht. die befehle werden nur umgeordnet.

    und

    b=x-a

    wird wohl nix, wie Sgt. Nukem richtig sagte...

    ich wollte eben mal wissen, wie man das am effektivsten in assembler macht. deshalb hab ich auch ins assembler-forum gepostet, und nicht unter "ansi c"...

    lw



  • Sgt. Nukem schrieb:

    Korrekter wär' wohl b = x - ( a * 10 ) 💡

    ach, das hatt ich leicht übersehen. aber aus dem
    b=x-a*10
    könnte man ja dann
    b-(x<<3)-(x<<1)
    machen. vielleicht bringt das was


  • Mod

    Lawilog schrieb:

    1. quellcode optimieren
    2. compiler optimierung EINSCHALTEN
    3. wiederkommen

    das hab ich auch schon versucht. " 😉 " hat aber nix gebracht. die befehle werden nur umgeordnet.

    möglicherweise solltest du mal auf den compiler, den du verwendest, und dessen optionen näher eingehen. ein kurzer versuch mit vc++7.1 reduziert die schleife bei mir jedenfalls auf 6 assembler befehle, die recht optimal aussehen.



  • camper schrieb:

    möglicherweise solltest du mal auf den compiler, den du verwendest, und dessen optionen näher eingehen. ein kurzer versuch mit vc++7.1 reduziert die schleife bei mir jedenfalls auf 6 assembler befehle, die recht optimal aussehen.

    hey! 🙂 könntest du die vllt mal posten? da wärst du mein persönlicher held... 👍
    ich selbst hab den bcc32 version 5.5... da gibts für 'maximale' optimierung ^o) die option -O2 (nein, keine werbung... 😉 ) aber die scheints nich wirklich zu bringen...

    lw

    EDIT: http://msdn.microsoft.com/visualc/vctoolkit2003/ tuts auch... 😃

    und @net: ganz ehrlich...koks net so viel... 😉 (nich böse gemeint 🤡 )



  • eine nette alternative zur langsammen division durch 10 ist

    a=(((x<<4)+(x<<3))+(x+(x>>1)))>>8;

    😉


  • Mod

    rapso schrieb:

    eine nette alternative zur langsammen division durch 10 ist

    a=(((x<<4)+(x<<3))+(x+(x>>1)))>>8;

    😉

    aber auch nicht besondrs exakt: 2560 / 10 😉



  • camper schrieb:

    rapso schrieb:

    eine nette alternative zur langsammen division durch 10 ist

    a=(((x<<4)+(x<<3))+(x+(x>>1)))>>8;

    😉

    aber auch nicht besondrs exakt: 2560 / 10 😉

    a=(((x<<4)+(x<<3))+(x+(x>>1))+(x>>7))>>8;
    das müßte es wieder für ne weile richten, je nach zahlengröße muss man das halt anpassen... ich hatte wohl vergessen zu sagen dass das nur ne approximation mittels reciproker multiplikation ist. :heiligenschein:

    😉


Anmelden zum Antworten