将位插入字节

时间:2010-05-17 14:06:35

标签: c++ byte bits bitmask

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

以下是来自字节的example I found读取位:

    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

2 个答案:

答案 0 :(得分:3)

如果您使用上面示例中的连续整数常量值,则在将它们放入一个字节时,应该使用这些常量来移位这些位。否则它们会重叠:在您的示例中,Msg_Id等于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

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

答案 1 :(得分: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;
}