在联合中设置字段位的最佳方法
Best way to set bits of fields in union
假设我有以下内容
struct S {
union {
uint8_t flags;
struct {
uint8_t flag2bits : 2;
uint8_t flag1bit : 1;
};
};
};
S s;
s.flag2bits = 2;
s.flag1bit = 1; // this will wipe out the values of other bits
在不影响其他位域的情况下为特定位赋值的最佳方法是什么?
我可以移动,然后赋值,然后再移动但这意味着一旦有人改变了位字段的顺序,代码就被破坏了....
我可以移动,然后赋值,然后再移动,但这意味着一旦有人改变了位字段的顺序,代码就会被修改破碎的…
不,这并不意味着代码被破坏了。你可以随意改变位域(以任何顺序/你可以保留一些不设置)
在你的例子中:
S s;
s.flag2bits = 2;
s.flag1bit = 1;
改变flag2bits
不影响flag1bit
中存储的值。
然而,您的问题可能与您在struct
中持有的union
有关。更改 flags
变量将影响两个位域,因为您将它们存储在单独的struct
中。
我希望这个例子能解释这里的情况:
#include <iostream>
#include <cstdint>
struct S {
union {
uint8_t flags;
struct {
uint8_t flag2bits : 2;
uint8_t flag1bit : 1;
};
};
};
int main(int argc, char *argv[]) {
S s;
s.flag2bits = 2;
s.flag1bit = 1;
std::cout << int(s.flag2bits) << int(s.flag1bit) << std::endl;
s.flags = 4; // As you are using union, at this point you are overwriting
// values stored in your (nested) struct
std::cout << int(s.flag2bits) << int(s.flag1bit) << std::endl;
return 0;
}
EDIT: As @M。M指出,从union的成员中读取不是最近写入的数据是未定义的行为。尽管至少在clang-3.5上,上面的代码将打印:
21
01
,它说明了我想要做的一点(即覆盖联合字段)。
我会考虑从您的struct S
代码中删除union
,尽管我可能看不到您想要实现的全部内容。
c++编译器将为您管理这些位。你可以设置你所拥有的值。只有合适的位才会被设置。
你试过吗?
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?