Bitshifting
-
Hi Leute!
Wie kann ich eine unsigned int Variabe um n-Bits nach rechts verschieben und die bits die rechts herausfallen links wieder vorhängen?
Bsp.: ich habe die binäre zahl 011001 und verschiede diese um 2 bits nach rechts dann soll die Zahl aber nicht 0110 aussehen sondern 010110
schnon mal danke das ihr mir helfen wollt und euch meinen Post durchlest und mir vieleicht auch die lösung schickt.
MfG
blind
-
Hallo,
ich hab da ne lösung, aber nur unter der voraussetzung, das du die anzahl p der signifikanten bit-stellen kennst. Das kann man aber auch ganz leicht nachzählen. Bei einem int z.b. einfach so lange counten, bis die letzte 1 erreicht ist und die anzahl dann in p speichern.
#include <stdio.h> int rotate(int x, int n, int p); /*x ist deine zahl, n sind die stellen, die du rotieren willst und p sind die anzahl der signifikanten bits(ich hoffe, das ich den ausdruck signifikant hier richtig benutze :rolling_eyes: )*/ int main(void) { printf("0x%x\n", rotate(0x19,2,6)); return 0; } int rotate(int x, int n, int p) { return (x&(~(~0<<n)))<<(p-n)|(x>>n); }
Wenn Fehler drin sind, wirst du sicher hier benachrichtigt werden
. Ich denke aber das das so funzt.
Kann das jemand noch kompakter @ Windalf & Co.
bash0r
-
Hier mal das was ich verwende
#define bit_sizeof(x) (sizeof(x) * 8) // rotate left inline unsigned int rot_l(unsigned int x, size_t count) { return (x << count) | (x >> (bit_sizeof(x) - count)); } // rotate right inline unsigned int rot_r(unsigned int x, size_t count) { return (x >> count) | (x << (bit_sizeof(x) - count)); }
Wichtig ist nur, dass du mit unsigned Typen shiftest, da bei signed unerwünschte Ergebnisse entstehen können.
-
_rotl (...);
_rotr (...);
-
LUZA schrieb:
_rotl (...);
_rotr (...);MS-spezifisch