Bits teilen in C



  • Hallo,

    ich habe folgende Long Variable: FFEEDDCC So steht die im Speicher. Ich möchte nun das ganze irgendwie in Bytes aufteilen und in einzelne Integer Variablen reinschieben, also das sowas rauskommt

    Int1 = FF
    Int2 = EE
    Int3 = DD
    Int4 = CC

    Wie mache ich das? Ich komme nicht weiter und stehe auf dem Schlauch.

    Ich hoffe Ihr könnt mir helfen

    Gruß

    Sebastian



  • Hallo Sebastian,

    schau dir mal in einem Buch das Kapitel bit shifts und
    logische Operationen an.

    #include <stdio.h>
    #include <stdlib.h>
    
    static unsigned int
    int2byte(unsigned int a, int i) {
        unsigned int res = 0;
        unsigned int mask = 0xff;
        int j;
    
        for (j=0; j<i; ++j) mask = mask << 8;
        res = a & mask;
        for (j=0; j<i; ++j) res = res >> 8;
    
        return res;
    }
    
    int main (void) {
        unsigned int a = 0xFFEEDDCC;
        int i;
    
        printf("a: 0x%x  size: %u\n", a, sizeof(a));
        for (i=0; i<4; ++i) printf("a[%d]:  0x%x\n", i, int2byte(a, i));
        return 1;
    }
    

    Gruß
    mcr



  • Bits sind unteilbar. 0 oder 1 da kann man nix mehr teilen.



  • umständlicher geht's wohl nicht^^

    #define int2byte(a,i) ((a)>>((i)<<3)&0xff)
    

    😉



  • Stimmt, du hast Recht, das war schon ziemlich umständlich.
    Ich hatte vorher eine andere Idee, die sich dann mit dem
    Vorschlag von mir vermischt hat.

    Gruß mcr



  • shifter schrieb:

    umständlicher geht's wohl nicht^^

    #define int2byte(a,i) ((a)>>((i)<<3)&0xff)
    

    😉

    Oh net, was für Compiler verwendest du denn die i*8 nicht zu nem shift optimieren...



  • Tim schrieb:

    shifter schrieb:

    umständlicher geht's wohl nicht^^

    #define int2byte(a,i) ((a)>>((i)<<3)&0xff)
    

    😉

    Oh net, was für Compiler verwendest du denn die i*8 nicht zu nem shift optimieren...

    das war aus den fingern gesaugt. sollte für jeden compiler gut sein.
    🙂



  • Tim schrieb:

    Oh net, was für Compiler verwendest du denn die i*8 nicht zu nem shift optimieren...

    Ist schon richtig so mit Shift, da dies genau der Intension entspricht.


Anmelden zum Antworten