首页 > 解决方案 > 如何将位域写入整数值?

问题描述

我正在尝试这样做:

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 的值来保存颜色的真实十六进制值。

标签: cbit-fields

解决方案


我认为您最好的选择是编写一个简单的转换器函数,如下所示:

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 标准保留。我还建议不要使用typedefs ,除非您正在创建一个包含完全不透明对象的库。


推荐阅读