user1808215
user1808215

Reputation: 283

Define union that can access bits, nibbles, bytes

union bits {
   unsigned int a : 1;
    unsigned int b : 2;
    unsigned int c : 3;
    unsigned int d : 4;``
    unsigned char x[2];
    unsigned int z; 
};

Suppose in a union of 32 bits, i need to use a single bit, or a group of bits, or nibble, or bytes. is there a way to define the union.

Upvotes: 2

Views: 10295

Answers (2)

flyman
flyman

Reputation: 210

you can use bitfields in a struct like the following:

typedef union
{
  struct
  {
    unsigned char bit0 : 1;
    unsigned char bit1 : 1;
    unsigned char bit2 : 1;
    unsigned char bit3 : 1;
    unsigned char bit4 : 1;
    unsigned char bit5 : 1;
    unsigned char bit6 : 1;
    unsigned char bit7 : 1;
  }bits;
  unsigned char byte;
}byte;

and then if you'll have byte b;, you can access each bit like that: b.bits.bit1

Upvotes: 0

tletnes
tletnes

Reputation: 1998

You need a union of bitfields. If you just use a union all of your fields will point to the same place.

union{
    struct {
        unsigned int bit1 : 1;
        unsigned int bit2 : 1;
        unsigned int bit3 : 1;
        unsigned int bit4 : 1;
        unsigned int bit5 : 1;
        unsigned int bit6 : 1;
        unsigned int bit7 : 1;
        unsigned int bit8 : 1;
        ...
        unsigned int bit32 : 1;
    };
    struct {
        unsigned int nibble1 : 4;
        unsigned int nibble2 : 4;
        ...
    };
    struct {
        unsigned int byte1 : 8;
        unsigned int byte2 : 8;
        ...
    };
    unsigned int int_value;
}

Upvotes: 4

Related Questions