位移位、屏蔽还是位域结构?

2023-12-09

我是使用位的新手。我正在尝试使用现有协议,该协议可以发送三种不同类型的消息。

类型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 分割为两个字节,该 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 应用程序中。

Thanks.

Brad


你可以通过一系列的轮班来做到这一点,ands, and ors。我已经完成了类型2的10位索引部分:

unsigned int i = 252;

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

本质上,这段代码的作用是将感兴趣的 10 位移位int i到范围 16 - 25,那么它and与位掩码一起使用0x7f0000将位 22 - 31 设置为零。它还将 10 位的另一个副本移位到范围 17 - 26,然后and与位掩码一起使用0x7000000将位 0 ​​- 22 和 26 - 31 设置为零。然后它or将两个值组合在一起以创建所需的零分隔值。

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

Edit:方法二:

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 更具可读性,因此您可能应该使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

位移位、屏蔽还是位域结构? 的相关文章

随机推荐