008
10.10.2005, 22:13 Uhr
ao
(Operator)
|
Zitat von ~Thomy: |
Ok, and how to copy a bit?
|
Ungefähr so (ungetestet hingekritzelt). Ist auch nicht portabel, sondern für 32-Bit-Daten. Für andere Wortbreiten müsste die 0x80000000 angepasst werden.
C++: |
unsigned csl (unsigned val, unsigned sh) // csl = cyclic left shift { while (sh--) { unsigned carry = val & 0x80000000; // oberstes Bit merken val = (val << 1) | (carry ? 1 : 0); // schieben und oberstes Bit unten wieder reinkopieren } return val; }
|
Wirkt vielleicht auf den ersten Blick sehr schlecht optimiert, in ner Schleife n-mal um 1 zu shiften. Aber erstens ist das Prinzip so einfacher zu durchschauen und zweitens, um in einem Schritt shiften zu können, muss man eine Maske mit n 1-Bits vorbereiten, um die rausgeschobenen Bits zu retten, d.h. ganz umsonst gibts das nicht.
ao Dieser Post wurde am 10.10.2005 um 22:19 Uhr von ao editiert. |