2013-10-04 2 views
0

나는 char * 문자열을 가져 왔습니다. 그에 맞게 저장해야합니다. 나는 데이터 유형을 사용하는 것이 최고입니다 열거 형, 그들을 유지하려면C의 열거 형 및 문자열

이 문자열은 해당 값 {영국, GD, BD, ER, WR, FL}

중 하나가 될 수 있습니다. 6 값처럼 3 비트이면 충분하지만 C에 3 비트를 저장하는 방법은 무엇입니까?

+0

'value : 2'는 작동하지 않습니까? 또한 6 개의 값으로 2 비트가 충분하지 않습니다. 3이 필요합니다. –

+2

"2 비트이면 충분합니다"... 다른 6 비트와 근본적으로 중요한 것을 할 것인가, 아니면 아무 이유없이 더 열심히 살게 할 것입니까? – Jon

+1

여섯 가지 옵션 중 선택 사항을 2 비트로 저장하는 방법을 정확히 어떻게 제안합니까? – Kevin

답변

1

그냥 부호없는 short로 저장하십시오. 전체 단어를 채우기 위해 구조체에 다른 것을 저장하지 않는 한, 너무 성급하게 최적화하는 것입니다. 어쨌든 컴파일러는 데이터를 패딩해야합니다.

+1

'unsigned short'는 이상하게 보입니다. 아마도'unsigned char' 또는 단지'int'입니까? – anatolyg

+0

그래, 괜찮 으면 좋을 것 같은데. 왜 내가 서명하지 않은 단편을 선택했는지 확신 할 수 없다. – Falmarri

4

은 당신이 원하는 것은 Bit Field입니다 :

typedef struct { 
    unsigned char val : 2; //use 2 bits 
    unsigned char : 6; // remaining 6 bits 
} valContainer; 

... 

valContainer x; 
x.val = GD; 

바이트의 정의는 메모리의 가장 작은 양이 컴퓨터가 할 수있는 한, 정말 미만 바이트를 저장하는 방법이없는 점에 유의 함 주소. 이것은 바이트의 다른 비트와 연관된 이름을 갖는 방법 일뿐입니다.

또한 물론 2 비트는 6 값 (2 비트는 4 개의 고유 한 값을 가짐)에 충분하지 않습니다. 따라서 적어도 3 비트 (8 개의 별개 값)가 필요합니다.

0

에릭 핀 (Eric Finn)의 대답에 따르면 비트 필드를 사용하여 3 비트의 데이터 요소를 저장할 수 있습니다. 그러나 이것은 동일한 바이트에 저장할 다른 것이있는 경우에만 유용합니다.

struct { 
    unsigned char value: 3; 
    unsigned char another: 4; 
    unsigned char yet_another: 5; 
    // 12 bits declared so far; 4 more "padding" bits are unusable 
} whatever; 

당신이 많은 그런 작은 요소의 배열을 저장하려면

, 각 32 비트 워드에서 10 개 요소를 응집, 예를 들어, 다른 방법으로 그것을 할 수 있습니다.

int n = ...; // number of elements to store 
uint32_t *data = calloc(n/10, sizeof(*data)); 
for (int i = 0; i < n; i++) 
{ 
    int value = read_string_and_convert_to_int(); 
    data[i/10] &= ~(7 << (i % 10 * 3)); 
    data[i/10] |= value << (i % 10 * 3); 
} 

당신은 단지 하나의 요소 (또는 몇)을 가지고 싶다면, 단지 enum 또는 int를 사용합니다.