Bits verschieben



  • Abend,

    ich habe gerade ein kleines Bit-Problem 🙂
    Ich kann ja innerhalb einer Variable Bits verschieben. Nur wie verschiebe ich Bits von einer Variable auf eine andere?

    Ich habe z.B. zwei Bytes: 01000001 und 01000010. Nun möchte ich die letzten 4 Bit vom ersten Byte und die ersten vier Bit vom zweiten Byte kombinieren. Letztendlich soll das Ergebnis in diesem Beispiel 00010100 sein.



  • Du kannst Masken Benutzen. Um die 4 ersten Bits eines Bytes zu bekommen, mach folgendes:

    int x=???;
    int y=x&15;
    

    15=00001111_2

    Graphisch:

    01000001 = x
    00001111 = 15
    ------------ &
    0000[b]0001[/b] = y
    

    Dann musst du mal 16 multiplizieren, damit die bits um 4 Stellen nach Links rutschen.

    Um die 4 letzten benutzen wir folgende Maske:

    int a=???;
    int b=x&240;
    

    240=16*15=(2^4)*15=00001111 vier mal nach links geshiftet.

    Graphisch:

    01000010 = a
    11110000 = 240
    ------------ &
    [b]0100[/b]0000 = b
    

    Damit b auch die bist in den 4 ersten bekommt, musst du durch 16 teilen, also

    b/=16;
    

    Und dann

    int result=y|b;
    

    Also:

    int x=65; /* 65=01000001 */
    int y=66; /* 66=01000010 */
    int a=(x&15)*16;
    int b=(y&240)/16;
    int result=a|b; /* result=20=00010100 */
    


  • Wieso so umständlich und unverständlich?

    unsigned int result = ((a & 0x0f) << 4) | ((b >> 4) & 0x0f);
    


  • groovemaster schrieb:

    Wieso so umständlich und unverständlich?

    unsigned int result = ((a & 0x0f) << 4) | ((b >> 4) & 0x0f);
    

    damit er versteht, wie sowas zustande kommt



  • Danke, habt mir beide sehr geholfen.


Anmelden zum Antworten