카메라 개발자 공부방(SW)

[28장] 비트필드 본문

Langauge/C

[28장] 비트필드

luckmart 2021. 10. 22. 10:22
반응형

자 오늘은 비트 필드에 대해 공부해볼 시간입니다.

 

C언어에서 연산을 할 수 있는 메모리의 최소 단위가 얼마일까요? 바로~ 1byte입니다.

그런데 이 1byte 보다 작은 단위의 연산을 필요로 하는 경우 어떻게 해야 될까요? 이때 비트 필드가 사용될 수 있습니다.


지금은 메모리 기술이 비약적으로 발전했기 때문에 메모리 자원이 넘치죠?
1byte쯤은 무시할 수 있지만, 과거엔 1byte 마저 소중했기 때문에 bit를 쪼개서 메모리를 관리하였답니다.

(임베디드 산업에선 여전히 메모리 리소스가 부족하기 때문에 bit 단위로 쪼개서 데이터에 저장을 합니다. 사용하는 방법을 제대로 알면 유용하게 사용할 수 있습니다.)

 

비트 필드를 선언하는 방법은 다음과 같습니다.

typedef struct bitfield {
    int flag : 1;
    int reserved : 30;
} BitField;

구조체를 선언한 후 ':'와 사용할 bit를 선언하면 비트 필드를 사용할 수 있습니다.

#include <stdio.h>

typedef struct bitfield
{
    int flag : 1;
    int reserved : 31;
} BitField;

int main()
{
    BitField data;
    data.flag = 1;
    data.reserved = 255;
    return 0;
}

위의 코드를 메모리로 그려보면 다음과 같습니다.

32bit 메모리 중 1bit는 flag 메모리로 사용하고, 나머지 bit는 reserved 메모리로 사용하겠다는 의미입니다.

BitField 메모리 그림

다음 예제를 또 볼까요?

#include <stdio.h>

typedef struct bitfield
{
  int a : 8;
  int b : 8;
  int c : 8;
  int d : 8;
  
} BitField;

int main()
{
    BitField data = {1, 2, 4, 8};
    return 0;
}

32bit 메모리 중 8bit 씩을 a, b, c, d에 메모리에 할당해서 사용한다는 의미입니다.
16진수로 변환된 메모리가 32bit 메모리에 8bit씩 나눠져서 저장되고 있는 것을 확인할 수 있습니다.

BitField 메모리 그림


#include <stdio.h>

typedef struct bitfield
{
  unsigned a : 8;
  unsigned b : 8;
  unsigned c : 8;
  unsigned d : 8;
  
} BitField;

int main()
{
    BitField data = {1, 2, 4, 8};
    return 0;
}

unsigned int는 'int'를 생략해서 표현할 수 있습니다.

#include <stdio.h>

typedef struct bitfield
{
  unsigned a : 1;
  unsigned b : 1;
  unsigned   : 2;
  unsigned   : 4;
  unsigned c : 8;
  unsigned d : 8;
  unsigned e : 8;
  
} BitField;

int main()
{
    BitField data = {1, 1, 1, 1, 1};
    printf("%x\n", data);
    return 0;
}

위의 예제에 대해 결과를 고민해보세요~

BitField 메모리 그림

2bit. 4bit 메모리에는 이름이 없습니다.

자 오늘은 여기까지!

'Langauge > C' 카테고리의 다른 글

[27장] union  (0) 2021.10.20
[25장] main 함수의 인자전달  (0) 2021.10.18
[26장] 가변인자  (0) 2021.10.17
[24장] const  (0) 2021.10.13
[23장] 파일 입출력  (0) 2021.10.12
Comments