001
25.10.2006, 08:49 Uhr
ao
(Operator)
|
x ist eine double-Variable (64 Bit Fließkomma). Über den reinterpret_cast wird sie als 64-Bit-Ganzzahl zugänglich gemacht. Das ist nötig, weil die XOR- und Schiebe-Operatoren nur auf Ganzzahlen angewendet werden können.
p ist danach ein Zeiger auf eine 64-Bit-Ganzzahl, die das Bitmuster enthält, das (als double interpretiert) dem Wert x entspricht. Bisschen kompliziert, aber beim Bitfrickeln gehts oft so zu.
Jetzt gehts los. *p >> 32 schiebt den 64-Bit-Wert um 32 Stellen nach rechts, dabei wird von links mit Nullen aufgefüllt. Das ergibt also einen 64-Bit-Wert, der in den 32 oberen Bits Null ist und in den 32 unteren Bits die oberen Bits von *p enthält.
Jetzt kommt XOR. XOR bedeutet, es wird bitweise verglichen und die Stellen, die gleiche Werte enthalten (beide 0 oder beide 1), werden im Ergebnis 0, und die Stellen, die verschiedene Bits enthalten, werden 1. Das ziehen wir von links nach rechts durch und erhalten ein 64 Bit langes Ergebnis.
Dieses wird in der Rückgabe auf 32 Bit gekürzt (Rückgabetyp ist U_Int32), d.h. die oberen 32 Bit werden weggeworfen, und nur die unteren 32 werden verwendet.
Unterm Strich bleibt also als Ergebnis die VerXORung der oberen 32 Bit von x (*p>>32) mit den unteren.
Ich hoffe, das hilft weiter.
ao |