【问题标题】:Inserting bits into byte将位插入字节
【发布时间】:2010-05-17 22:30:05
【问题描述】:

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

这是从一个字节读取位的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

【问题讨论】:

  • 你的问题不清楚。当您说“插入”时,您的意思是替换现有位还是仅以其他位被移到一边的方式插入?

标签: c++ byte bits bitmask


【解决方案1】:

如果您使用如上例中的连续整数常量值,则应在将这些常量放入字节时移位这些位。否则它们会重叠:在您的示例中,Msg_Id 等于 Msg_Event &amp; 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 &amp; 0x0F) == Msg_Id((Msg_Event &lt;&lt; 4) &amp; 0xF0) == (Msg_Event &lt;&lt; 4)

【讨论】:

    【解决方案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-10-29
      • 2012-10-18
      • 1970-01-01
      • 2021-11-30
      • 2019-05-23
      • 2018-03-02
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      相关资源
      最近更新 更多