gpt4 book ai didi

c - 用 8 位整数替换部分 16 位整数

转载 作者:行者123 更新时间:2023-11-30 19:51:31 24 4
gpt4 key购买 nike

在此示例中,我有一个由 16 位整数组成的结构。我将这些整数的某些部分读取到 8 位整数结构的组件中。然后我操作 8 位整数,并且我想重新加载 16 位整数。下面的代码解释得更好一些。有什么想法吗?

    struct SIXTEEN
{
uint16_t COMPONENT[8];
};

struct EIGHT
{
uint8_t COMP1;
uint8_t COMP2;
uint8_t COMP3;
};

void main()
{
//For the purposes of this example, assume *S is a pointer to
// this array
// 0000 AABB CC00 0000
struct SIXTEEN *S;

struct EIGHT E;

E.COMP1 = S -> COMPONENT[2]; //AA
E.COMP2 = S -> COMPONENT[3]; //BB
E.COMP3 = S -> COMPONENT[4]; //CC

//Let's manipulate these a little
struct EIGHT HOLD;
HOLD.COMP1 = E.COMP3; //HOLD.COMP1 has CC
E.COMP3 = E.COMP1; //E.COMP3 has AA
E.COMP2 = HOLD.COMP1; //E.COMP2 has CC
E.COMP1 = E.COMP2; //E.COMP1 has BB

//Now I want to pass the components of E into their new
//places in S so the array in S becomes:
// 0000 BBCC AA00 0000
//
// No idea, this certainly doesn't work:
// S -> COMPONENT[2] = E.COMP1;
}

这是一个较大项目中的一个问题,所以我不会删除指针 S​​。

最佳答案

至少有两种方法可以实现您想要的功能,并且在这两种方法中您都必须知道 CPU 的字节顺序。鉴于您基本上有两个结构:

struct SIXTEEN { uint16_t COMPONENT[8]; };
struct EIGHT { uint8_t COMP1 COMP2 COMP3 };

您可以使用 union 创建一个可以通过两种方式访问​​的类型,可以通过复制该 union 中的源数据,也可以使用指针和类型转换。但我认为使用指针更简单。使用您的数据:

struct SIXTEEN *S; // points to "0000 AABB CC00 0000"
struct EIGHT E;

通过做

E.COMP1 = S -> COMPONENT[2]; //AA

您没有得到 AA,而是得到了第三个​​元素的低 8 位,即 CC 或可能是 CC 旁边的 00。

尝试一下:

uint8_t* ptr;
ptr = (uint8_t *) & S -> COMPONENT[1]; // points to AABB
E.COMP1 = *(ptr +0); // you get AA or BB
E.COMP2 = *(ptr +1); // you get the other one
E.COMP3 = *(ptr +2); // you get CC or 00

这种方式很容易理解,也很容易修改,就玩+0,+1之类的。一旦完成对 E.COMPx 的操作,您就可以以相同的方式写回数据:

*(ptr +0) = E.COMP1;

您还可以使用数组表示法[];对我来说,使用指针算术似乎更容易解释,但这只是品味问题,最终结果可能完全相同。

关于c - 用 8 位整数替换部分 16 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42882308/

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