320x100
제목에서 알 수 있다시피, 메모리를 공유하는 변수가 존재한다.
만약 0b00010100(20)이라는 숫자에서 bit 4번째 숫자만 0으로 바꾸고 싶다면?
비트마스킹을 이용하여 0b11101111을 and 연산을 할 수 있다.
상황에 따라 인덱스를 접근하는 함수를 만들고, 어려운 변수 값을 집어넣고... 연산하고...
이게 한눈에 보기 어렵다는 것이다 -> 가독성이 떨어짐
공용체를 사용하면 좀 더 보기 쉽게 사용이 가능하다.
(이외에 임베디드쪽에서 ON/OFF 식의 센서 값을 모아서 관리하거나, 프로토콜 프레임 등 규칙성이 있는 정보를 관리하는데 효율적으로 사용된다)
아래는 소스코드.
#include <stdio.h>
typedef union{
unsigned char BYTE;
struct{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}BIT;
}Data;
Data test_data;
void main()
{
test_data.BIT.bit0 = 1;
test_data.BIT.bit2 = 1;
test_data.BIT.bit4 = 1;
test_data.BIT.bit6 = 1;
printf("size = %ld, byte = %d\n",sizeof(test_data), test_data.BYTE);
return;
}
union이라는 것을 처음 본다면, 중괄호 안에 unsigned char 변수 하나, unsigned char 변수 8개의 구조체...
총 9Byte의 변수라고 생각할 수도 있지만, 1Byte이다.
공용 메모리를 쓰기 때문이고, 콜론 연산자는 bit 수를 나타내기 때문에 8bit = 1byte를 공용 메모리로 사용 중인 것이다.
구조체 BIT의 0, 2, 4, 6을 1로 바꾸었고, 공용 메모리를 사용하는 BYTE 변수도 bit값이 바뀌면서 0b01010101(85)를 출력하게 된다.
반응형
'프로그래밍 > C,C++,C#' 카테고리의 다른 글
[C,C++,C#] 구조체 메모리 크기 계산 (0) | 2023.06.04 |
---|---|
[C,C++,C#] 전처리 ##연산자 (0) | 2023.06.04 |
[C/C++] 간편하게 LOG 남기기(feat. 가변인자) (0) | 2023.03.29 |
[Unity] Google Play Console에서 광고 ID 사용을 선언해야합니다. (0) | 2022.11.12 |
[C#.NET] 폼 최대창으로 로드하기(창 넓이, 높이 값 구하기) (0) | 2022.09.28 |
댓글