2010-05-17 88 views
1

我在看一個從字節讀取位的例子,實現看起來簡單易懂。我想知道是否有人有類似的例子來說明如何將字節插入到字節或字節數組中,這更容易理解,也可以像下面的例子那樣實現。在字節中插入位

下面是從一個字節讀取位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

您的問題不明確。當你說「插入」時,你的意思是替換現有的位還是隻以其他位移動的方式插入? – user88637 2010-05-17 14:14:41

+0

試試這個 - http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c – SysAdmin 2010-05-17 14:16:57

回答

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 

注意,在代碼上面掩蓋0x0F0xF0是不是真的需要:(Msg_Id & 0x0F) == Msg_Id((Msg_Event << 4) & 0xF0) == (Msg_Event << 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; 
}