2010-11-28 1 views
4

비트 패킹 된 구조체 안에 배열을 갖고 싶습니다. 배열의 크기를 정적으로 알고 (32), 배열의 각 요소를 단일 비트로 만들고 싶습니다. 나는 몇 가지를 시도했지만, GCC는 꿈쩍도하지 않습니다비트 패킹 된 구조체 내부의 배열

struct example_s { 
    // ... 
    unsigned int flags[32] : 32; 
} __attribute__((__packed__)); 

예를 들어, 내가 뭔가 같은 말을 할 수 있도록하고 싶습니다. packed 배열의 요소를 반복하는 깨끗한 코드를 작성할 수 있도록이 작업을 수행하는 것이 좋을 것입니다. 아이디어? 당신은 단순히 (32 비트) INT에 넣어 경우

+0

메모리 매핑 I/O에 해당합니까? – nmichaels

+0

비트 패킹 된 구조체 란 무엇입니까? –

+0

Nope. 스택에 저장되고 스택에서 액세스되는 일부 런타임 메타 데이터입니다. – mhahnenb

답변

6

, 당신은 명확하게 다음과 같이 for 루프와 비트를 반복 할 수 있습니다

for (bit = 0; bit < 32; bit++) 
    flagValue = ((flags & (1<<bit)) != 0; 

별로 열심히 배열 인덱싱 구문보다 쓰기 .

코드를 읽기 쉽게하기 위해 비트 트위 더링을 숨기려면 함수 나 매크로를 사용하여 비트에 액세스 할 수도 있습니다. GetFlag(bit)

+0

예, 매크로가 갈 길처럼 보이고 있습니다. 오 잘! – mhahnenb

1

Bitfield 멤버 요소에는 주소가 없으므로 배열을 선언 할 수는 있지만 사용할 수는 없습니다 (C의 모든 배열 액세스는 포인터 산술 및 역 참조입니다). 그래도 더 큰 유형의 비트를 사용하여 자신의 비트 배열을 쉽게 코드화 할 수 있습니다. Jason이 기본을 설명했습니다. 일반적으로 당신이 정말로 좋은 이유가 없다면 비트 필드 사용을 피해야합니다. 그들은 보통 가치가있는 것보다 더 많은 문제가 있습니다.

+0

구조체 멤버에 관해서도 같은 것을 말할 수 있습니다. 컴파일러는 일반적으로 구조체의 기본 주소로부터 오프셋을 생성합니다. 비트 패킹 된 구조체로 값을 가져오고 설정하려면 약간의 추가 마법을 수행해야합니다. 따라서 배열과 관련하여 같은 종류의 비하인드 스토리를 수행 할 수없는 이유는 없습니다. 그리고 비트 필드를 사용하는 좋은 이유가 있습니다 :-) – mhahnenb

+0

아니요.'struct foo'가'char bar [10]'멤버를 가지고 있다면,'foo.bar'는'char *'를 평가하는 표현식이고, 'foo.bar [2]'는'* (foo.bar + 2)'로 평가되어 모든 것을 작동시킵니다. 배열 구문'a [b]'는'* (a + b)'에 대한 문법적 설탕 (괄호없는 편리한 그룹핑)입니다. –

+0

비트 필드를 사용하는 "좋은 이유"가있는 경우 제이슨의 대답을 이해하지 못했습니다. Google 또는 SO에 대한 이전 질문에서 비트 배열 구현을 검색해보십시오. 만족스러운 답변을 찾을 수있을 것입니다. –