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.