我正在尝试使用结构将多个较小的整数打包到
uint32_t
中。
struct PackedData {
PackedData & operator=(uint32_t x) {
a = (x >> 24) & 0xFF;
b = (x >> 8) & 0xFFFF;
c = x & 0xFF;
return *this;
}
uint32_t operator=(PackedData x) {
uint32_t temp;
temp = (x.a << 24) & 0xFF000000;
temp |= (x.b << 8) & 0xFFFF00;
temp |= x.c & 0xFF;
return temp;
}
uint32_t a : 8;
uint32_t b : 16;
uint32_t c : 8;
};
最初,我希望继承
uint32_t
,类似于使用 enum
类所做的事情。
struct PackedData : uint32_t {
不幸的是,这不能编译。
奇怪的是,我粘贴的结构确实可以编译,甚至不会发出警告
-Wall -Wextra --pedantic
。
好的一面是,我可以看到我的结构体有 4 个字节,并且我可以为该结构体分配一个 32 位整数。但是,我无法将该结构分配给 32 位整数。
我确信以下方法的语法是完全错误的,但我不知道怎么做,编译器也没有帮助我。
uint32_t operator=(PackedData x) {
uint32_t temp;
temp = (x.a << 24) & 0xFF000000;
temp |= (x.b << 8) & 0xFFFF00;
temp |= x.c & 0xFF;
return temp;
}
这个想法可行吗,或者有更好的方法吗?
您可以定义隐式转换运算符,如下所示:
struct PackedData {
// ...
operator uint32_t () const {
uint32_t temp;
temp = (a << 24) & 0xFF000000U;
temp |= (b << 8) & 0xFFFF00U;
temp |= c & 0xFFU;
return temp;
}
};
现在你可以做:
PackedData p { 0xef, 0x1234, 0xab };
uint32_t x = p;
x
的值为0xef1234ab