32-bitrotation..



  • Hallo,

    Ich habe die Funktion zum links-rotieren zwar schon irgendwo gefunden und auch erfolgreich in PHP-Umschreiben können, allerdings verstehe ich die Herleitung nicht.

    function rotate_left ( &$x, &$n )
      {
        return ( ( $x << $n) | ( $x >> ( 32 - $n) ) );
      }
      void rotate_left ( x, n )
      {
        return ( ( x << n) | ( x >> ( 32 - n) ) );
      }
    

    Und: Gibt es sowas wie "<< >>" in C++ für die Rotation, damit ich nicht die obige Funktion verwenden muss?

    Danke schonmal!



  • x << n verschiebt erst mal alles um n Stellen nach links, die rechts neu dazukommenden Bits haben den Wert 0. Sie sollten allerdings die Werte der Bits übernehmen, die links rausfallen. Deshalb steht dahinter ein | ( x >> ( 32 - n) ). Beispiel:

    |          Speicherbereich          |
                        11000010.11111001.00011010.01010101				// n = 16
    (11000010.11111001.)00011010.01010101.00000000.00000000				// x << n
                        00000000.00000000.11000010.11111001(.00011010.01010101)	// x >> (32 - n)
    
                        00011010.01010101.11000010.11111001				// |-Verknüpfung der beiden Zeilen
    


  • Wichtig zu erwähnen wäre noch, dass man für das Shiften nur unsigned Werte benutzen sollte. Ansonsten bekommt man keine zuverlässigen Ergebnisse.


Anmelden zum Antworten