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 :>


Anmelden zum Antworten