为结构(具有联合成员,是否重要?)创建构造函数的最佳方法是将uint8_t
类型转换为结构?
这是我的例子,以澄清更多:
struct twoSixByte
{
union {
uint8_t fullByte;
struct
{
uint8_t twoPart : 2;
uint8_t sixPart : 6;
} bits;
};
};
uint32_t extractByte(twoSixByte mixedByte){
return mixedByte.bits.twoPart * mixedByte.bits.sixPart;
}
uint8_t tnum = 182;
print(extractByte(tnum)); // must print 2 * 54 = 108
P.S。 从评论和发现中找到答案,在C ++中不可能为工会打字。
给出的解决方案有点复杂,特别是在代码中有很多这些结构的地方。甚至有些情况下字节被分成多个位部分(多于两个)。因此,如果不利用联合,而是使用位集和移位,会给代码带来很多负担。
相反,我设法提供了一个更简单的解决方案。我只是在将类型传递给函数之前转换了类型。这是固定代码:
struct twoSixByte
{
union {
uint8_t fullByte;
struct
{
uint8_t twoPart : 2;
uint8_t sixPart : 6;
} bits;
};
};
uint32_t extractByte(twoSixByte mixedByte){
return mixedByte.bits.twoPart * mixedByte.bits.sixPart;
}
uint8_t tnum = 182;
twoSixByte mixedType;
mixedType.fullByte = tnum;
print(extractByte(mixedByte)); // must print 2 * 54 = 108
答案 0 :(得分:4)
除非您迫切需要使用union
,否则请勿使用它。简化您的课程:
struct twoSixByte
{
twoSixByte(uint8_t in) : twoPart((in & 0xC0) >> 6), sixPart(in & 0x3F) {}
uint8_t twoPart : 2;
uint8_t sixPart : 6;
};
如果需要获取完整字节,可以使用:
uint8_t fullByte(twoSixByte mixedByte)
{
return ((mixedByte.twoPart << 6) | mixedByte.sixPart);
}
答案 1 :(得分:2)
您可以避免union
和type punning并使用具有相关成员函数的结构。请注意,如果struct
被视为aggregate to be initialized,我们就不需要构造函数:
#include <cstdint>
struct twoSixByte {
uint8_t fullByte; // no constructor needed, initializing as an aggregate
uint32_t extractByte(){
return ((fullByte & 0b1100'0000) >> 6) * (fullByte & 0b0011'1111);
}
};
int main()
{
twoSixByte tnum{182};
auto test = tnum.extractByte(); // test == 2 * 54 == 108
}