如何将位域写入整数值?
How to write a bitfield to an integer value?
我正在尝试这样做:
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 的值,其中包含颜色的真实十六进制值。
这是一个独立示例,展示了如何使用联合来访问具有位字段的结构的值:
#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
我认为你最好的选择是像这样编写一个简单的转换器函数:
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 除非你正在创建一个包含完全不透明对象的库。
我正在尝试这样做:
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 的值,其中包含颜色的真实十六进制值。
这是一个独立示例,展示了如何使用联合来访问具有位字段的结构的值:
#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
我认为你最好的选择是像这样编写一个简单的转换器函数:
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 除非你正在创建一个包含完全不透明对象的库。