bitshifting vs. /2?



  • Hi,

    man kann ja mit bitshifting wunderbar durch 2 teilen, doch was ist besser und schneller?

    640/2 oder 640>>1



  • Shiften ist schneller. Dafür kannst du auch nur durch 2er-Potenzen teilen.



  • Eigentlich sollte der Compiler das selbst optimieren wenn du konstant durch 2 dividierst.
    Daher ist es meiner Meinung nach sinnvoller /2 zu schreiben weil der Code sonst doch etwas undurchschaubar wird. 🙂



  • Exakt. Wenn der Compiler feststellt, dass du immer nur durch eine Zweierpotenz dividierst oder mit einer multiplizierst, ersetzt er es selbständig durch eine Bitschiebeoperation. Das ist keine besonders schwierige Optimierung, man kann also mit gutem Gewissen davon ausgehen, dass das jeder optimierende Compiler kann.



  • Allerdings geht es nur wenn die Zahl positive ist, ansonsten ist >>1 nitcht gleich /2 und der compiler wird auch nicht optimiren.



  • Strenggenommen hast du Recht. Es ist falsch, dass >>1 garantiert durch 2 teilt, wenn die Zahl negativ ist. Allerdings interessiert das den Optimierer nicht. Wenn der Prozessor einen Rechtsschiebebefehl kennt, der für vorzeichenbehaftete Zahlen geeignet ist, dann wird er ihn auch benutzen. Intel x86 unterscheidet z.B. zwischen SAR und SHR (Shift (Arithmetically) Right), wovon ersterer für vorzeichenbehaftete Zahlen und letzterer für vorzeichenlose Zahlen gedacht ist.



  • Strenggenommen hast du Recht. Es ist falsch, dass >>1 garantiert durch 2 teilt, wenn die Zahl negativ ist. Allerdings interessiert das den Optimierer nicht.

    Den Compiler aber, den wenn er ein Bitshift setzt wo der Programierer eine negativ Division erwartet dann wird das ein schwer zu findender Bug.

    Was ich damit meinte ist, dass das:

    int a=5;
    a/=2;
    

    nicht optimiert werden wird da der Compiler annimmt, dass a negativ sein kann. Deshalb muss man:

    unsigned int a=5;
    a/=2;
    

    schreiben. In dem Fall weis der Compiler, dass die Zahl nicht negativ ist und wird optimiren.

    Die ganzen bitshift Tricks gehen alle nur wenn man mit positiven Zahlen arbeitet also kann der Compiler nicht bei int optimiren, weil er in diesem Fall von etwas ausgeht, dass der Programier ihm nicht gesagt hat.



  • ich meine mal irgendwo gelesen zu haben, dass mitlerweilen schon prozessoren multiplikationen und divisionen mit zweierpotenzen intern optimieren und der shifting "trick" dadurch überflüssig werde. bei gelegenheit muss ich das mal testen...



  • *** schrieb:

    Den Compiler aber, den wenn er ein Bitshift setzt wo der Programierer eine negativ Division erwartet dann wird das ein schwer zu findender Bug.

    Hast du das mit SAR und SHR überhaupt gelesen oder nur nicht verstanden?? 👎


Anmelden zum Antworten