본문 바로가기

programmer/Programming

C 언어 Bit field 배열- 최소 메모리로 flag 저장하기

간단한 Flag 값을 저장하고 싶고 메모리도 줄이고 싶을때 우리는 보통 bit field를 사용한다. 잘만 사용하면 메모리 활용을 극대화 시킬 수 있다.

bit field를 사용하는 2가지 방법을 정리해본다.

1. h와 #define 을 사용한 bit field 배열화

2. 기본적인 bit field와 구조체를 사용한 배열화를 진행해 본다.

#define Prov_Stopwatch_Max_N 						1000

typedef Prov_u8 									BIT_FIELD_TYPE ;
#define BIT_SIZE									(BIT_FIELD_TYPE)(sizeof(BIT_FIELD_TYPE) * 8)
#define StwhArrSize									(Prov_Stopwatch_Max_N / BIT_SIZE) + 1

#define SetBit(array, n)  							do { array[n / BIT_SIZE] |= (1 << (n % BIT_SIZE)); } while (0)
#define GetBit(array, n) 							((array[n / BIT_SIZE] >> (n % BIT_SIZE)) & 1)

volatile BIT_FIELD_TYPE arr_st[StwhArrSize];

void main()
{
	SetBit(arr_st, 0);
	SetBit(arr_st, 1);
	SetBit(arr_st, 2);
	SetBit(arr_st, 3);
	SetBit(arr_st, (Prov_Stopwatch_Max_N -1));
    
 }

<기존적인 Bit Field 사용법>

struct st
{
    unsigned char _stwhflag  :1;   // Will take only a byte
    unsigned char _auflag  :1; 	 // Will take only a byte
} arr_st[100];

해당 구조체를 보면 unsigned char (1byte)를 사용해 2개의 flag를 생성하였다.

 

1. bit16 헤더 생성

/*
 * bit16.h
 *
 *  Created on: 2020. 6. 22.
 *      Author: sure
 */

#ifndef BIT16_H_
#define BIT16_H_


__bit16(0)
__bit16(1)
__bit16(2)
__bit16(3)
__bit16(4)
__bit16(5)
__bit16(6)
__bit16(7)
__bit16(8)
__bit16(9)
__bit16(10)
__bit16(11)
__bit16(12)
__bit16(13)
__bit16(14)
__bit16(15)




#endif /* BIT16_H_ */

char 8개 , short 16개, int 32개 원하는대로 설정해서 사용 가능하다.

 

2. 구조체 선언

typedef struct _S_Prov_BIT16
{
#define __bit16(idx) unsigned bit16##idx :1;
#include "Prov_bit16.h"
#undef __bit16
}S_Prov_BIT16, *PS_Prov_BIT16;

#define _bit16(idx) bit16##idx
#define bit(idx) _bit16(idx)

포인터로도 사용할 수 있다.

 

3. 사용방법

S_Prov_BIT16 stwcFlag_16b_[100];


unsigned char law = 10;

stwcFlag_16b_[law].bit(0);

 

해당 방법의 문제점 (적용하기 전에 꼭 보세요)

- ~.bit(0) <- 해당 부분이 H 파일에 선언된 (0) 과 일치해야만 접근 가능하다.

만약 #define INDEX_# 0 과같이 선언후 사용하는 경우 ~.bit(INDEX) 와 같이 사용하면 정상 작동한다.
때에따라 적용해서 사용하면 될 듯하다.

 

반응형
사업자 정보 표시
라울앤알바 | 장수호 | 서울특별시 관악구 봉천로 13나길 58-10, 404호(봉천동) | 사업자 등록번호 : 363-72-00290 | TEL : 010-5790-0933 | Mail : shjang@raulnalba.com | 통신판매신고번호 : 2020-서울관악-0892호 | 사이버몰의 이용약관 바로가기

'programmer > Programming' 카테고리의 다른 글

함수 포인터 사용 예  (0) 2020.10.22
원형 큐(circuit queue) 예제  (0) 2020.10.21
Pthread 개념 및 예제  (0) 2020.10.21