1

我正在看一个从字节中读取位的示例,实现看起来简单易懂。我想知道是否有人有类似的如何将位插入字节或字节数组的示例,这更容易理解并且也像下面的示例一样实现。

这是我发现的从字节中读取位的示例:

    static int GetBits3(byte b, int offset, int count)
    {
           return (b >> offset) & ((1 << count) - 1);
    }

这就是我想要做的。这是我目前的实现,我只是对位屏蔽/移位等有点困惑,所以我试图找出是否有更简单的方法来做我正在做的事情

BYTE Msg[2];
Msg_Id = 3;
Msg_Event = 1;
Msg_Ready = 2;

Msg[0] = ( ( Msg_Event << 4 ) & 0xF0 ) | ( Msg_Id & 0x0F ) ;
Msg[1] = Msg_Ready  & 0x0F;     //MsgReady & Unused
4

2 回答 2

3

如果您使用如上例中的连续整数常量值,则应在将这些常量放入字节时移位这些位。否则它们会重叠:在您的示例中,Msg_Idequals Msg_Event & Msg_Ready。这些可以像

Msg[0] = ( 1 << Msg_Event ) | ( 1 << Msg_Id); // sets the 2nd and 4th bits

(请注意,字节内的位从 0 开始索引。)另一种方法是使用 2 的幂作为常数值:

Msg_Id = 4;    // equals 1 << 2
Msg_Event = 1; // equals 1 << 0
Msg_Ready = 2; // equals 1 << 1

请注意,在上面的代码中,并不真正需要使用0x0For进行屏蔽:和.0xF0(Msg_Id & 0x0F) == Msg_Id((Msg_Event << 4) & 0xF0) == (Msg_Event << 4)

于 2010-05-17T14:13:20.557 回答
2

您可以使用位字段。例如 :

struct Msg
{
   unsigned MsgEvent  : 1; // 1 bit
   unsigned MsgReady  : 1; // 1 bit
};

然后,您可以使用联合来操作位域或字节,如下所示:

struct MsgBitField {
   unsigned MsgEvent : 1; // 1 bit
   unsigned MsgReady : 1; // 1 bit
};

union ByteAsBitField {
   unsigned char Byte;
   MsgBitField Message;
};

int main() {
   ByteAsBitField MyByte;
   MyByte.Byte = 0;
   MyByte.Message.MsgEvent = true;
}
于 2010-05-17T14:18:51.890 回答