본문 바로가기

C-Language/Bit Fields

Bit Fields in C Language

C 언어의 비트 필드(Bit Fields)



메모리의 사용을 최소한으로 줄여야 하는 소형 임베디드 시스템에서 실행될 프로그램을 작성한다면 숫자 한개를 메모리에 저장하더라도 가급적 메모리를 최소한으로 차지하도록 신경을 써야 할 때가 있을 것이다. 예를 들어, 소형 마이크로 콘트롤러를 이용하여 LED에 점등/소등을 해야 한다면 ON/OFF 정보만 표현하면 되므로 0, 1 만 사용해도 된다. 그러나 char, short, int 형 정수 변수를 사용하여 0, 1을 저장해야 한다면 실제보다 훨씬 많은 메모리를 할당해야 하므로 비효율적이다. 


C 언어에서는 Bit Fields 라는 방법으로 이러한 문제를 해결할 수 있다. 구조체와 거의 같은 형식으로 선언 및 사용할 수 있다

비트필드가 차지하는 메모리의 크기는 기본적으로 4바이트이며 비트필드를 구성하는 변수들의 총 비트 수가 32비트를 초과하면 다시 4바이트가 추가로 할당되어 8바이트가 되는 방식으로 메모리가 할당된다


비트 필드 선언 형식

struct [ 비트필드 태그]

{

   한개 이상의 비트필드 선언 ;

} [ 한개 이상의 변수 이름] ;


비트필드를 선언할 때 구조체 안에 선언할 수 있는 자료형은 int , undigned int, signed int 중 한가지이어야 한다


구조체 안에 비트필드를 선언할 때의 형식

자료형 필드명 : 비트의 수 ;

비트필드 변수 선언의 예

unsigned int led1 : 1 ;



#include <stdio.h>

struct STATUS
{
	unsigned int led1 : 1;
	unsigned int led2 : 1;
	unsigned int led3 : 1;
	unsigned int led4 : 1;
};

void printBit(struct STATUS *status);

int main()
{
	struct STATUS ledStatus;
	ledStatus.led1 = 0;
	ledStatus.led2 = 1;
	ledStatus.led3 = 1;
	ledStatus.led4 = 0;

	// 비트필드의 메모리 할당 크기는 기본이 4바이트이고 변수가 4바이트를 초과하는 경우 4바이트가 추가된다
	printf("비트필드의 메모리 할당 크기=%d \n", sizeof(ledStatus)); // 4

	printBit(&ledStatus);

	return 0;
}

void printBit(struct STATUS *status)
{
	printf("led1=%d, led2=%d, led3=%d, led4=%d \n",
		status->led1, status->led2, status->led3, status->led4);
}