Как записать битовое поле в целочисленное значение? - PullRequest
1 голос
/ 07 ноября 2019

Я пытаюсь сделать это:

typedef struct {
    uint16_t red : 6;
    uint16_t green : 5;
    uint16_t blue : 5;
} color_t

Затем я хотел бы получить что-то вроде:

color_t clr;
clr.red = 0;
clr.green = 10;
clr.blue = 15;

И записать составную переменную clr в int:

int value = clr; // this does not work

fprintf(draw, "%4X", value);

Причина, по которой я это делаю, заключается в том, что я хочу создать цвета, такие как оранжевый, фиолетовый и т. Д., И нарисовать их на экране из файла. Внутри файла я пишу цвет в шестнадцатеричном формате.

Другое дело, что я хотел бы сделать это позже в своем коде:

if (clr == value) { ... }

Или, другими словами, яХотелось бы сравнить значения из struct bitfield и int, содержащие реальное шестнадцатеричное значение цвета.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2019

Я думаю, что ваш лучший вариант - написать простую функцию конвертера, например:

uint16_t colorToInt(color_t c)
{
    uint16_t ret = 0;
    ret |= c.blue;
    ret |= c.green << 5;
    ret |= c.red << 10;
    return ret;
}

Тогда вы можете просто сделать

int value = colorToInt(clr);

И вот обратное:

color_t intToColor(uint16_t x)
{
    color_t ret = {
        .blue = 0 | x,
        .green = 0 | x >> 5,
        .red = 0 | x >> 10
    };
    return ret;
}

Примечание: избегайте использования идентификаторов, заканчивающихся на _t. Они защищены стандартом POSIX. Я также не советую использовать typedef s, если вы не создаете библиотеку с полностью непрозрачными объектами.

0 голосов
/ 07 ноября 2019

Это автономный пример, показывающий, как использовать объединение для доступа к значению структуры с битовыми полями:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    uint16_t red: 6;
    uint16_t green: 5;
    uint16_t blue: 5;
} color_t;

typedef union {
    uint16_t color_value;
    color_t color_bits;
} color_helper_t;

int main(void) {
    color_helper_t clr;

    clr.color_bits.red = 0;
    clr.color_bits.green = 0;
    clr.color_bits.blue = 15;

    uint16_t value = clr.color_value;

    printf("%04X\n", value);

    if (clr.color_value == value) {
        printf("The values are equal\n");
    }

    return 0;
}

Выход

7800
The values are equal
...