#include <stdio.h>
#include <stdint.h>
typedef struct {
uint32_t bit1 : 1;
uint32_t bit2 : 2;
uint32_t bit3 : 3;
} MyBits;
union MyUnion {
uint32_t all;
MyBits bits;
};
int main() {
union MyUnion myUnion;
myUnion.all = 0;
myUnion.bits.bit1 = 1;
myUnion.bits.bit2 = 2;
myUnion.bits.bit3 = 5;
printf("all: %u\n", myUnion.all);
printf("bit1: %u\n", myUnion.bits.bit1);
printf("bit2: %u\n", myUnion.bits.bit2);
printf("bit3: %u\n", myUnion.bits.bit3);
return 0;
}
비트 필드(Bit Field)와 공용체(Union)
- 비트 필드는 비트 단위로 필요한 만큼의 공간을 할당하는 방식으로, 여러 개의 비트를 구조체 멤버로 사용하는 데이터 형식이다.
- 공용체는 여러 개의 멤버가 같은 메모리 위치를 공유하는 데이터 형식이다.
비트 필드멤버 정의
typedef struct {
uint32_t bit1 : 1;
uint32_t bit2 : 2;
uint32_t bit3 : 3;
} MyBits;
위 예시에서 MyBits라는 구조체를 선언하고, 3개의 비트 필드 멤버 bit1, bit2, bit3를 정의 한 뒤 각 비트 필드 멤버에 할당된 비트 수를 콜론 : 뒤에 적어 비트 필드 멤버의 오프셋과 길이를 지정한다. bit1의 범위는 0~1, bit2의 범위는 0~3, bit3의 범위는 0~7이 된다.
비트 필드의 멤버는 기본적으로 메모리의 가장 낮은 비트부터(Least Significant Bit, LSB) 가장 높은 비트(또는 Most Significant Bit, MSB)까지 차례로 할당되므로 bit1이 [0:0], bit2가 [2:1], bit3이 [5:3]에 위치하게 된다.
공용체 선언
union MyUnion {
uint32_t all;
MyBits bits;
};
MyUnion이라는 공용체를 선언하고, uint32_t 형식의 all 멤버와 MyBits 구조체 형식의 bits 멤버를 동일한 메모리 위치에 공유하도록 설정한다.
여기서 all 멤버는 비트 필드 멤버들이 차지하는 비트들을 하나로 합쳐서 표현한 값이고, bit1, bit2, bit3 각 비트 필드 멤버들을 통해 값에 개별적으로 접근한다.
예시
typedef struct {
unsigned int rsvd1: 4;
unsigned int SEQ_CASC: 1;
unsigned int SEQ_OVRD: 1;
unsigned int CONT_RUN: 1;
unsigned int CPS: 1;
unsigned int ACQ_PS: 4;
unsigned int SUSMOD: 2;
unsigned int RESET: 1;
unsigned int rsvd2: 1;
} ADCTRL1_BITS;
union ADCTRL1_REG {
unsigned int all;
ADCTRL1_BITS bit;
};
이렇게 비트 필드와 공용체를 사용하면 레지스터를 전체적으로 다루기 위한 변수와 레지스터의 각 비트 필드를 동시에 다룰 수 있다.
'프로그래밍 > C' 카테고리의 다른 글
C, C++ ] system("pause") 대신 사용할 수 있는 방법 (0) | 2023.07.11 |
---|---|
C ] 포인터와 const (0) | 2023.05.30 |
C언어 ] setjmp(), longjmp() (0) | 2023.05.07 |
C언어 ] 맵 자료구조 구현 (0) | 2023.05.07 |
C ] float to hex / hex to float Converter (0) | 2023.04.09 |