Вставка битов в байт - PullRequest
1 голос
/ 17 мая 2010

Я смотрел на пример чтения битов из байта, и реализация выглядела простой и легкой для понимания. Мне было интересно, если у кого-нибудь есть подобный пример того, как вставить биты в байтовый или байтовый массив, это легче понять и реализовать, как в примере ниже.

Вот пример , который я нашел чтения битов из байта:

    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 ]

3 голосов
/ 17 мая 2010

Если вы используете последовательные целочисленные значения констант, как в приведенном выше примере, вы должны сдвигать биты этими константами, помещая их в байт. В противном случае они перекрываются: в вашем примере 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).

2 голосов
/ 17 мая 2010

Вы можете использовать битовое поле.Например:

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;
}
...