我是使用位的新手。我正在尝试使用现有协议,它可以发送三种不同类型的消息。
类型 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 应用程序中。
谢谢。
布拉德