gpt4 book ai didi

c++ - 在 C++ 中为结构( union )创建构造函数

转载 作者:行者123 更新时间:2023-11-30 00:44:08 30 4
gpt4 key购买 nike

为结构(具有 union 成员,这重要吗?)创建构造函数以将 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

附言从评论和答案中发现, union 的类型双关在 C++ 中是不可能的。

给出的解决方案有点复杂,特别是在代码中有很多这样的结构的地方。甚至有一个字节被分成多个位部分(两个以上)的情况。因此,如果不利用 union ,而是使用位集和移位位,则会给代码增加很多负担。

相反,我设法找到了一个更简单的解决方案。我只是在将类型传递给函数之前转换了类型。这是固定代码:

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

最佳答案

除非迫切需要使用union,否则不要使用它。将您的类(class)简化为:

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);
}

关于c++ - 在 C++ 中为结构( union )创建构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50178804/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com