c - 如何将位域写入整数值?
问题描述
我正在尝试这样做:
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 的值来保存颜色的真实十六进制值。
解决方案
我认为您最好的选择是编写一个简单的转换器函数,如下所示:
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 ,除非您正在创建一个包含完全不透明对象的库。
推荐阅读
- python - 具有动态共享库的 Setuptools
- python - 从命令行反汇编 Python 脚本?
- reactjs - 为什么这个 SWR 间隔获取代码不起作用?
- javascript - 从 json 文件 JavaScript 获取数据
- r - 在 R 中模拟一个奇怪的分布
- c# - LINQ 选择列表按百分比最接近数字的位置
- python-3.x - 在 Python 中重复相同的代码块
- amazon-athena - 汇总动态列的值并在新列中应用公式
- c# - Entity Framework 6 Core - 多列引用
- algorithm - 这两种算法分析方式哪一种是对的?它们之间有什么区别?