Bitverschiebung



  • Hey Leute ich möchte mich mal informieren.

    In der Schule lerne ich C programmieren, auch hobbymäßig beschäftige ich mich mit ca. 8 verschiedenen Programmiersprachen (darunter auch Auszeichnungssprachen) und immer wieder werde ich mit dem Kapitel "Bitverschiebung" konfrontiert (natürlich nicht in allen Sprachen).

    Nun zu meiner Frage: Was bring sich die Bitverschiebung genau? bzw. könnt ihr mir Beispiele nennen wo die Bitverschiebung in großen Programmen angewendet wird und für was. Oder für was diese generell verwendet wird.
    Klar zum kippen, verschieben, verunden etc. von Bits, aber warum?

    Ist reine Neugierde 😃

    Mit freundlichen Grüßen



  • Theoretisch benötigen tut man das nicht, gibt ja die Multiplikation. Die Operation ist allerdings wesentlich schneller auf den mir bekannten CPUs. Wann man so etwas in "echtem" Code sieht? Bei binären Protokollen, die die Bits genau an irgendeiner Stelle haben wollen vielleicht, ganz sicher bei einigen Verschlüsselungs-/Hashalgorithmen. Ansonsten wohl eher selten.



  • Erst mal danke für die schnelle und informative Antwort.

    Dass heißt eine Berechnung geht als Bitoperation, keine Ahnung wie ich das nennen soll, schneller als die Berechnung ausgeschrieben mit ganz normalen Dezimalzahlen und mit "+", "-" etc. sry ist ein bisschen eigenartig ausgedrückt.

    Mit binären Protokollen meinst du Dateien (Textdateien etc.) wo du den Zeiger an eine bestimmte Stelle setzen kannst?



  • Nur mal so nebenbei, folgendes Programm

    int main()
    {
        for(int i = 0; i < 1000000000; ++i)
            volatile int x = i << 1;
    }
    

    braucht bei mir 0.92 Sekunden.

    int main()
    {
        for(int i = 0; i < 1000000000; ++i)
            volatile int x = i * 2;
    }
    

    braucht 0.56 Sekunden. (g++ 4.6.2, -O3)



  • Oha das macht ja einen mächtigen Unterschied vorallem wenn das größere und mehr Berechnungen sind. Also das war mir eigentlich nicht bewust. Da sollte ich mich mit dem Thema noch weiter beschäftigen.

    Danke für das Beispiel 😉



  • Oh ich merke gerade, ich hab mich verschaut o.O. Dann ist die Bitverschiebung ja um ein Hauseck langsamer...



  • Incocnito schrieb:

    Nur mal so nebenbei, folgendes Programm

    Joa, das ist in der Tat interessant. Hier mal der Code der von VS generiert wird (VS gibt ähnliche Ergebnisse):

    for(int i = 0; i < 1000000000; ++i)
    00E2123D  xor         ecx,ecx  
    00E2123F  nop  
        volatile int x = i << 1;
    00E21240  lea         eax,[ecx+ecx]  
    00E21243  inc         ecx  
    00E21244  mov         dword ptr [esp+30h],eax  
    00E21248  cmp         ecx,3B9ACA00h  
    00E2124E  jl          main+20h (0E21240h)
    
    013B123D  xor         ecx,ecx  
    013B123F  nop  
      for(int i = 0; i < 1000000000; ++i)
        volatile int x = i * 2;
    013B1240  mov         dword ptr [esp+30h],ecx  
    013B1244  add         ecx,2  
    013B1247  cmp         ecx,77359400h  
    013B124D  jl          main+20h (013B1240h)
    

    Interessant deshalb, weil bei der * 2 Version eine Optimierung gemacht wird, die man so erstmal nicht erwarten würde. Der addiert einfach immer 2 auf i, und [hier stand Quatsch] muss deshalb nicht mehr rechnen. Komisch dass er den Trick bei der shift Version nicht rafft. Aber wie dem auch sei, einen Vergleich zwischen shift und Multiplikation hast du so nicht zustande gebracht. 😉



  • Der durchläuft die Schleife nicht halb so oft, sondern er läuft in Zweierschritten von 0 bis 2 Milliarden statt in Einerschritten von 0 bis 1 Milliarde.

    i * 2 und i << 1 sind bei vorzeichenbehafteten Integern nicht äquivalent, und ich weiß nicht, ob MSVCs Optimiser rafft, dass es im betrachteten Wertebereich trotzdem ginge. Versuch's mal mit unsigned, da könnte er das eher merken.



  • seldon schrieb:

    Der durchläuft die Schleife nicht halb so oft, sondern er läuft in Zweierschritten von 0 bis 2 Milliarden statt in Einerschritten von 0 bis 1 Milliarde.

    Stimmt natürlich.

    seldon schrieb:

    i * 2 und i << 1 sind bei vorzeichenbehafteten Integern nicht äquivalent, und ich weiß nicht, ob MSVCs Optimiser rafft, dass es im betrachteten Wertebereich trotzdem ginge. Versuch's mal mit unsigned, da könnte er das eher merken.

    Nope, unsigned ändert nichts.


Anmelden zum Antworten