Frage zu Bitshift
-
hallo,
ich möchte mit diesem "Programm" Bits um zwei stellen shiften, funktioniert soweit auch
Was ich nun tun müsste, wäre die "hinausgeschobenen" Bits irgendwo hinspeichern... hab leider keine idee wie das gehen sollte.also hier mal mein "Programm":
int main() { int bitmask = 0xFF; int shift = 0x2; cout << bitmask << endl; cout << "after SHIFT" << endl; bitmask = bitmask >> shift; cout << bitmask << endl; return 0; }kann mir jemand einen tipp geben?
danke & lg
-
unsigned int herausgeschobene_bits; unsigned int mask = 0xFF; unsigned ins shift = 0x2; herausgeschobene_bits = ((~0u)>>(sizeof(int)*CHAR_BIT-shift))) & mask; mask >>= shift; std::cout<<"mask nach shift: "<<mask<<std::endl; std::cout<<"rechts herausgeschobene bits: "<<herausgeschobene bits;Geht bestimmt auch eleganter, aber sollte so funktionieren (gilt allerdings nicht für shift = 0, da shift um sizeof(T)*CHAR_BIT nicht definiert ist)
-
danke für deine hilfe... aber... noch jemand eine idee für mich?

-
Was hast du gegen die Idee von asdfasd?
Aber gut, hier noch was feines nicht portables.

#include <iostream> using namespace std; int RechtsRausgeschobeneBits( unsigned int num, unsigned int shift ) { unsigned int leftShift(sizeof(unsigned int)*8-shift); return (num << leftShift) >> leftShift; } int main() { unsigned int bitmask = 0xFF; unsigned int shift = 0x2; cout << bitmask << endl; unsigned int draussen(RechtsRausgeschobeneBits(bitmask, shift)); cout << "after shift: " << (bitmask >> shift) << endl; cout << "outgeschifft(ed): " << draussen << endl; return 0; }
-
asdfasd schrieb:
unsigned int herausgeschobene_bits; unsigned int mask = 0xFF; unsigned ins shift = 0x2; herausgeschobene_bits = ((~0u)>>(sizeof(int)*CHAR_BIT-shift))) & mask; mask >>= shift; std::cout<<"mask nach shift: "<<mask<<std::endl; std::cout<<"rechts herausgeschobene bits: "<<herausgeschobene bits;Geht bestimmt auch eleganter, aber sollte so funktionieren (gilt allerdings nicht für shift = 0, da shift um sizeof(T)*CHAR_BIT nicht definiert ist)
So würde ich es auch machen, bis auf
herausgeschobene_bits = mask & ((1 << shift) - 1)
-
@MichaelE: Wusste ich doch, dass es eleganter geht :>
Vielleicht ist noch interessant zu erwähnen, dass das ganze ohne "unsigned" garnicht mal so portabel ist :>