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_Idは equals ですMsg_Event & Msg_Ready。これらは次のように使用できます

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

(バイト内のビットは 0 からインデックス付けされることに注意してください。) もう 1 つのアプローチは、定数値として 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_Idand ((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 に答える