Union / Bitfeld



  • Hallo,

    es soll ein Programm werden, das einen int-Wert und ein Bitfeld zum Teil einer Union macht.
    Die Eingabe des int-Wertes soll über die Tastatur eingegeben werden. Dieser Wert soll anschließend in die Bitfeldstruktur eingelesen werden. Die Bitfeldstruktur soll ausschließlich aus Bitfeldern mit einen Bit bestehen. Zum Schluß soll dann der int-Wert binär auf dem Bildschirm erscheinen.

    Ich weiß aber im Moment nicht weiter, hoffe das wenigstens der Anfang richtig ist. Vielleicht kann ja jemand helfen.

    #include <stdio.h>
    #define BIL printf("n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    
       int i;
    
       typdef struct {
       						// Bit-Nr.
       unsigned int feld1 : 1;		// 1
       unsigned int feld2 : 1;		// 2
       unsigned int feld3 : 1;
       unsigned int feld4 : 1;
       unsigned int feld5 : 1;
       unsigned int feld6 : 1;
       unsigned int feld7 : 1;
       unsigned int feld8 : 1;
       unsigned int feld9 : 1;
       unsigned int feld10 : 1;
       unsigned int feld11 : 1;
       unsigned int feld12 : 1;
       unsigned int feld13 : 1;
       unsigned int feld14 : 1;
       unsigned int feld15 : 1;
       unsigned int feld16 : 1;
       unsigned int feld17 : 1;
       unsigned int feld18 : 1;
       unsigned int feld19 : 1;
       unsigned int feld20 : 1;
       unsigned int feld21 : 1;
       unsigned int feld22 : 1;
       unsigned int feld23 : 1;
       unsigned int feld24 : 1;
       unsigned int feld25 : 1;
       unsigned int feld26 : 1;
       unsigned int feld27 : 1;
       unsigned int feld28 : 1;
       unsigned int feld29 : 1;
       unsigned int feld30 : 1;
       unsigned int feld31 : 1;
       unsigned int feld32 : 1;		// 32
       }bitfeld1;
    
      typedef union
      {
      i;
      bitfeld1;
      } u_binaer;
    
      int main (void)
       {
    
       return 0;
       }
    


  • Braucht Du die Bits tatsächlich in der Struktur oder geht es nur um die Ausgabe des Wertes als Binärwert? Im letzten Falle ist das ein bisschen kompliziert, im Ansatz aber richtig.



  • so klappts:
    ich war mal so frei die ganzen felder in ein array zu packen 😉

    #include <stdio.h>
    #include <conio.h>
    #define BIL printf("n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    
    typedef union
    {
        int	          i;
        unsigned int  feld[32];
    }u_binaer;
    
    int main (void)
    {
    	u_binaer uni;
    
    	unsigned long x = 0;
    
    	scanf("%u", &x);
    
    	for (int n = 0; n < 32; )
    	{
    		uni.feld[n++] = x & 1;
    		x >>= 1;
    	}
    
    	while (n > 0)
    		printf("%d", uni.feld[--n]);
    
    	getch();
    
    	return 0;
    }
    


  • Nubian schrieb:

    typedef union
    {
        int	          i;
        unsigned int  feld[32];
    }u_binaer;
    

    Keine gut Idee.

    das braucht ja mindestens sizeof(int)*32 Bytes speicher...
    n bisschen für um 32 bit zu speichern, oder?

    btw: wenn es nur um die binär darstellung geht, halte ich ein bitfeld für ein bisschen umständlich...



  • hehe, stimmt! 🙂
    so weit hab ich dann wieder nich gedacht... 😞
    aber gibts nich auch nen einfachen weg zahlen binär darzustellen?
    mir ist so spontan nix eingefallen...



  • std::bitset



  • @ Herr-vorragend
    wir sind heir im ansi c forum !

    mfg



  • ouu, sorry, mein fehler 🙄



  • Nubian schrieb:

    hehe, stimmt! 🙂
    so weit hab ich dann wieder nich gedacht... 😞
    aber gibts nich auch nen einfachen weg zahlen binär darzustellen?
    mir ist so spontan nix eingefallen...

    sowas in der art?

    #define TYPE int
    #define BITS (sizeof(TYPE)*8)
    
    void f (TYPE x)
    {
        int s;
        for (s=0; s<BITS; s++)
        {
            if (x & 1<<(BITS-1))
                putchar ('1');
            else
                putchar ('0');
            x <<= 1;
        }
    }
    
    int main()
    {
        f (0xaaaa5555);
    }
    


  • Nubian schrieb:

    aber gibts nich auch nen einfachen weg zahlen binär darzustellen?
    mir ist so spontan nix eingefallen...

    Man kann char nehmen, das tut es oft. Ist zwar speicher verschwendung, dafür aber verdammt schnell beim zugriff

    ansonsten nimmt man "unsigned irgendwas" und shiftet immer selbst. so hat man perfekte speicher ausnutzung (ok, fast perfekte) aber der zugriff ist halt recht lahm.



  • net schrieb:

    sowas in der art?

    Jo, bis auf, dass es die daten nicht speichert 😉

    int bits = sizeof(TYPE) * 8;
    

    Lieber CHAR_BITS als 8 verwenden.



  • Shade Of Mine schrieb:

    Man kann char nehmen, das tut es oft. Ist zwar speicher verschwendung, dafür aber verdammt schnell beim zugriff

    ansonsten nimmt man "unsigned irgendwas" und shiftet immer selbst. so hat man perfekte speicher ausnutzung (ok, fast perfekte) aber der zugriff ist halt recht lahm.

    genau die beiden möglichkeiten sind mir auch eingefallen, aber ich dachte eigentlich dass es da noch was sinnvolleres gibt...
    naja, man kann halt nicht alles haben 😉

    @net:
    das sieht schon fein aus, werd ich mir merken 🙂



  • Nubian schrieb:

    ich dachte eigentlich dass es da noch was sinnvolleres gibt...
    naja, man kann halt nicht alles haben 😉

    Da man 1 bit nicht adressieren kann, schaut es da finster aus 😞



  • Shade Of Mine schrieb:

    so hat man perfekte speicher ausnutzung (ok, fast perfekte) aber der zugriff ist halt recht lahm.

    Ähmmm, warum ist der Zugriff bitte lahm?

    bzw. Was meinst du: Der maskierte Zugriff auf das integer oder das shiften selber? Das shiften selbst dürfte sehr schnell sein (ausser beim P4 vielleich).



  • TactX schrieb:

    Ähmmm, warum ist der Zugriff bitte lahm?

    Lahm im Vergleich zu dem char Array.
    Natuerlich ist der Zugriff recht schnell, aber eine pointer addition zu schlagen (die man bei einem char array ja hat) ist nahezu unmoeglich.

    das 'problem' hierbei ist, dass du dir das bit auch nicht wirklich merken kannst, dh, wenn du es setzt, liest und wieder setzt hast du 3 zugriffe - das ist natuerlich langsamer als einmal die addition bei dem char array und dann den speicher merken.

    natuerlich ist das nicht wirklich "lahm" aber im vergleich zu dem char array dennoch langsamer. und deshalb meistens nur dann sinnvoll, wenn der gesparte speicher etwas bringt. und das ist idr erst bei grossen zahlen der fall.



  • wenn ihr schon so wahnsinnig optimieren müsst, dann nehmt ein 'int'-array. damit sind die zugriffe noch ein tickchen schneller als bei 'char'


Anmelden zum Antworten