프로그래밍 목적이라기 보다는 DSP에서 한번 나왔던 개념이기에 혹시 궁금하신 분들은 참고하길 바랍니다~
사전적인 의미
:구조체의 구성 요소(member)의 선언에서 ':'을 함께하는 정수식을 지정하는 방법
목적
:메모리의 낭비를 줄이기 위함
요즘 컴퓨터는 성능이 매우 좋아서 별로 쓰이지 않지만, DSP와 같이 자원이 한정적인 기기들에는 여전히 유용하다.
예를들어 Int형 정수를 사용하는데 그 값은 0아니면 1만 나온다고 하자.(가령 GPIOA의 MUX는 0아니면 1이면 충분하다.) Uint16이라고 해도 16비트 즉 2바이트다. 1비트면 충분한데 16비트로 사용한다면 정말 큰 메모리 낭비이지 않겠는가? 이때, 선언은 16비트라도 메모리를 1비트로 사용할 수 있다.
아래 구조체를 보자
struct BitFieldTest {
unsinged int a : 2;
unsinged int b : 3;
};
이 구조체에 대한 size는 32비트(16X2)로 잡히고 하위 두 비트(0,1 번째)와 그 위의 세 비트(2,3,4 번째)가 사용되고 나머지 비트들은 사용되지 않는다. 따라서 메모리를 아낄 수 있다.
단점을 들자면 이 32비트 메모리에서 특정 비트들만 값을 변경할 때, 예를 들어 BitFieldTest.a = 1을 하면 단순히 a에 1을 대입하는 것이 아니라 (BitFieldTest & 3 | 1)로 처리되어 비트 연산을 수행하기 때문에 메모리는 아끼지만 속도가 느려지게 된다. MCU에서 MUX레지스터를 자주 바꾸지는 않을테니 큰 문제는 되지 않을것이라 본다.
위의 (BitFieldTest & 3 | 1)이 무슨 의미냐 하면 3이란 숫자는 0b11로 2비트를 의미하기 때문에 BitField의 2비트를 &로 추려내고 여기에 or연산자로 1을 대입하는 것이다. 따라서 한번 연산할 것을 2번연산하게 되는 것이다.
struct GPAMUX_BITS {
Uint16 PWM1_GPIOA0 : 1;
Uint16 PWM2_GPIOA1 : 1;
...
};
DSP 28x의 GPAMUX_BITS이다 단지 ON, OFF 만 사용한다면 0,1이면 되기에 1비트만으로도 충분하다.
signed 변수를 사용할 때 오버플로우 또는 언더플로우가 발생하지 않도록 값의 대입을 조심하도록 하자.
또한 당연하겠지만 비트수에 따른 표현 가능한 수의 갯수는 2의 n승이다.
'Software > Programming' 카테고리의 다른 글
구조체와 공용체. 공용체의 패딩 (0) | 2015.01.11 |
---|---|
MFC)버튼을 누르는 동안 지속되는 카운팅 예제 (2) | 2014.10.19 |
[비선형 자료구조]트리.그래프 (AVL 트리) (1) | 2013.05.25 |
전위표기. 후위표기 (0) | 2013.05.25 |
MFC 새로운 가상함수 추가 (0) | 2012.08.12 |