gpt4 book ai didi

c - 位移位、掩码还是位域结构?

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:52 28 4
gpt4 key购买 nike

我刚开始使用位。我正在尝试使用现有协议(protocol),它可以发送三种不同类型的消息。

类型 1 是 16 位结构:

struct digital 
{
unsigned int type:2;
unsigned int highlow:1;
unsigned int sig1:5;
unsigned int :1;
unsigned int sig2:7;
};

前两位(类型,在我上面的结构中)总是 1 0 。第三位highlow决定信号是开还是关,和sig1+sig2一起定义了信号的12位索引。这个索引被一个 0 分割成两个字节,它总是在第 7 位。

类型 2 是 32 位结构。它有一个 2 位类型、一个 10 位索引和一个 16 位值,在位置 27、23、15 和 7 处散布着 0。位域结构表示如下所示:

struct analog 
{
unsigned int type:2;
unsigned int val1:2;
unsigned int :1;
unsigned int sig1:3;
unsigned int :1;
unsigned int sig2:7;
unsigned int :1;
unsigned int val2:7;
unsigned int :1;
unsigned int val3:7;
};

sig1 和 sig2 一起构成 10 位索引。 val1 + val2 + val3 共同构成信号在10位索引处的16位值。

如果我了解如何使用前两个结构,我想我可以弄清楚第三个。

我的问题是,有没有办法分配一个值并让程序计算出需要进入 val1、val2 和 val3 的位?

我读过有关位移位、位域结构和用 0 填充的内容。该结构似乎是要走的路,但我不确定如何实现它。我见过的所有位打包示例都没有按这些方式拆分的值。最终,我希望能够创建一个模拟结构,分配一个索引 (i = 252) 和一个值 (v = 32768) 并完成它。

如果有人可以建议适当的方法或提供类似示例的链接,我将不胜感激。如果重要的话,这段代码将被合并到一个更大的 Objective-C 应用程序中。

谢谢。

布拉德

最佳答案

你可以用一系列的转变,ands,和ors来做到这一点。我已经完成了类型 2 的 10 位索引部分:

unsigned int i = 252;

analog a = (analog)(((i << 16) & 0x7f0000) | (i << 17) & 0x7000000);

本质上,这段代码所做的是将 int i 中感兴趣的 10 位移动到 16 - 25 的范围内,然后 and 使用位掩码 对其进行处理>0x7f0000 将位 22 - 31 设置为零。它还将 10 位的另一个副本移动到范围 17 - 26,然后它使用位掩码 0x7000000 将其设置为 0 - 22 位和 26 - 31 位零。然后它将这两个值组合在一起以创建您想要的零分隔值。

.. 我不确定我是否正确地计算了位掩码,但我希望你已经明白了。只需移动、屏蔽和或合并。

编辑: 方法二:

analog a;
a.sig1 = (i & 0x7f); // mask out bit 8 onwards
a.sig2 = ((i<<1) & 0x700); // shift left by one, then mask out bits 0-8

再三考虑,方法 2 更具可读性,因此您可能应该使用它。

关于c - 位移位、掩码还是位域结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1797345/

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