2013-11-15 6 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 비트, I는 단일 비트 또는 비트들의 그룹 또는 니블 또는 바이트를 사용할 필요 의 조합으로 가정 바이트. 노동 조합을 정의 할 수있는 방법이 있을까요?비트를 액세스 할 수있는 조합을 정의 니블은

+0

구조체의 조합 bitfields 그것을해야합니다. – 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

그럴 수도 있지만 '비트 1'이 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

관련 문제