2013-11-15 36 views
2
union bits { 
    unsigned int a : 1; 
    unsigned int b : 2; 
    unsigned int c : 3; 
    unsigned int d : 4;`` 
    unsigned char x[2]; 
    unsigned int z; 
}; 

假設以32位, 我需要使用單個位,或一組位,半字節或,或字節的聯合。有沒有一種方法來定義聯合。定義可訪問位結合,半字節,字節

+0

結構的工會位域應該這樣做。 – John

+0

我想定義一個32位的聯合。在這我可以訪問個人位,或半字節或字節。可能嗎? – user1808215

回答

3

您需要位域的聯合。如果你只是使用聯盟,你所有的領域都會指向同一個地方。

union{ 
    struct { 
     unsigned int bit1 : 1; 
     unsigned int bit2 : 1; 
     unsigned int bit3 : 1; 
     unsigned int bit4 : 1; 
     unsigned int bit5 : 1; 
     unsigned int bit6 : 1; 
     unsigned int bit7 : 1; 
     unsigned int bit8 : 1; 
     ... 
     unsigned int bit32 : 1; 
    }; 
    struct { 
     unsigned int nibble1 : 4; 
     unsigned int nibble2 : 4; 
     ... 
    }; 
    struct { 
     unsigned int byte1 : 8; 
     unsigned int byte2 : 8; 
     ... 
    }; 
    unsigned int int_value; 
} 
+0

這可能會工作,但我認爲不能保證'bit1'將是LSB。編譯器可以開始將位從msb分配給lsb。所以我不認爲它是可移植的。 – agbinfo

+0

非常感謝您的解決方案。 – user1808215

+0

任何時候,當你開始使用位域時,你已經離開了可移植性的世界,但是基於OP詢問他們在尋找什麼, – tletnes

0

可以使用位域的結構如下所示:

typedef union 
{ 
    struct 
    { 
    unsigned char bit0 : 1; 
    unsigned char bit1 : 1; 
    unsigned char bit2 : 1; 
    unsigned char bit3 : 1; 
    unsigned char bit4 : 1; 
    unsigned char bit5 : 1; 
    unsigned char bit6 : 1; 
    unsigned char bit7 : 1; 
    }bits; 
    unsigned char byte; 
}byte; 

,然後如果你有byte b;,您可以訪問每一位這樣的:b.bits.bit1