Define union that can access bits, nibbles, bytes

2019-02-19 07:44发布

问题:

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.

回答1:

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;
}


回答2:

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



标签: c unions