我正在查看从字节读取位的示例,实现看起来简单易懂。我想知道是否有人有一个类似的例子,如何将位插入字节或字节数组,这更容易理解,也可以像下面的例子一样实现。
以下是来自字节的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
答案 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
请注意,在上面的代码中,实际上并不需要使用0x0F
或0xF0
进行屏蔽:(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;
}