Использование битового поля с объединением - PullRequest
2 голосов
/ 13 февраля 2020

Я хочу создать простой пакет с битовыми полями, используя union. Но когда я попытался установить «bit1» в 1, все мои битовые поля стали «1». Как я могу решить эту проблему, я хочу сделать эту часть битового поля, используя объединение, а не используя struct.

Итак, моя структура;

    struct {
    union{
        uint8_t bit1 :1 ;
        uint8_t bit2 :1 ;
        uint8_t bit3 :1 ;
        uint8_t bit4 :1 ;
        uint8_t bit5 :1 ;
        uint8_t bit6 :1 ;
        uint8_t bit7 :1 ;
        uint8_t bit8 :1 ;


    }bits;
    uint8_t trial;


    }myStruct_t;

int main(int argc, char *argv[]) {
        myStruct_t.bits.bit1 = 1;
        myStruct_t.bits.bit2 = 0;
        printf("%x",myStruct_t.bits);
        printf("%x",myStruct_t.bits.bit1);
        printf("%x",myStruct_t.bits.bit2);

    return 0;
}

И вывод: 000.

1 Ответ

5 голосов
/ 13 февраля 2020

Поменяйте местами union с вашим struct.

Т.е. я считаю, что вы хотите объединить структуру и целое число, а не структуру объединения и целое число. (Я сохранил вводящее в заблуждение имя myStruct_t, которое, вероятно, сейчас должно быть myUnion_t.)

#include <stdio.h>
#include <stdint.h>

union
{
    struct
    {
        uint8_t bit1 :1 ;
        uint8_t bit2 :1 ;
        uint8_t bit3 :1 ;
        uint8_t bit4 :1 ;
        uint8_t bit5 :1 ;
        uint8_t bit6 :1 ;
        uint8_t bit7 :1 ;
        uint8_t bit8 :1 ;
    }bits;
    uint8_t trial;
}myStruct_t;

int main(int argc, char *argv[])
{
    myStruct_t.trial=0; // use the encompassing union member for init
    myStruct_t.bits.bit1 = 1; // now use the bitwise view to set bits
    myStruct_t.bits.bit2 = 0;
    printf("%x",myStruct_t.trial);
    printf("%x",myStruct_t.bits.bit1);
    printf("%x",myStruct_t.bits.bit2);

    return 0;
}

Вывод, который я получаю, равен 110, вы можете увидеть 12810. Помимо отсутствующих символов новой строки, которые помогло, это означает:

  • охватывающее 8-битное представление имеет значение 1, по крайней мере, с учетом порядка в моем окружении - вы можете увидеть 128
  • бит 1 имеет значение 1
  • бит 2 имеет значение 0
...