2010-05-17 30 views
1

Je regardais un exemple de lecture de bits à partir d'un octet et l'implémentation semblait simple et facile à comprendre. Je me demandais si quelqu'un a un exemple similaire de comment insérer des bits dans un tableau d'octets ou d'octets, qui est plus facile à comprendre et à implémenter comme l'exemple ci-dessous.Insérer des bits dans l'octet

Voici le example I found de lire les bits d'un octet:

static int GetBits3(byte b, int offset, int count) 
    { 
      return (b >> offset) & ((1 << count) - 1); 
    } 

Voici ce que je suis en train de faire. Ceci est ma mise en œuvre actuelle, je suis juste un peu confus avec le bit-masking/décalage, etc., donc j'essaie de savoir s'il existe un moyen plus facile de faire ce que je fais

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

problème Vous n'est pas clair. Quand vous dites "insérer", voulez-vous dire remplacer les bits existants ou simplement les insérer de manière à ce que les autres bits soient décalés? – user88637

+0

essayez ceci - http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c – SysAdmin

Répondre

3

Si vous utilisez des valeurs de constante d'entier consécutives comme dans l'exemple ci-dessus, vous devez décaler les bits avec ces constantes en les plaçant dans un octet. Sinon, ils se chevauchent: dans votre exemple, Msg_Id est égal à Msg_Event & Msg_Ready. Ceux-ci peuvent être utilisés comme

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

(Notez que les bits dans un octet sont indexés à partir de 0.) L'autre approche serait en puissances de 2 valeurs constantes:

Msg_Id = 4; // equals 1 << 2 
Msg_Event = 1; // equals 1 << 0 
Msg_Ready = 2; // equals 1 << 1 

Notez que dans votre code ci-dessus, masquage avec 0x0F ou 0xF0 n'est pas vraiment nécessaire: (Msg_Id & 0x0F) == Msg_Id et ((Msg_Event << 4) & 0xF0) == (Msg_Event << 4).

2

Vous pouvez utiliser un champ de bits. Par exemple:

struct Msg 
{ 
    unsigned MsgEvent : 1; // 1 bit 
    unsigned MsgReady : 1; // 1 bit 
}; 

Vous pouvez ensuite utiliser un syndicat pour manipuler soit le bitfield ou l'octet, quelque chose comme ceci:

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