일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- git
- jupyter
- Python
- 깃
- c언어
- C# delegate
- Houdini
- 도커
- C언어 포인터
- jupyter lab
- Flutter
- docker
- gitlab
- github
- Algorithm
- C++
- 구조체
- c#
- c# 윈폼
- vim
- dart 언어
- 플러터
- HTML
- Data Structure
- 포인터
- c# 추상 클래스
- c# winform
- 다트 언어
- Unity
- 유니티
Archives
- Today
- Total
nomad-programmer
[Programming/C] 비트 단위 분리 본문
구조체 문법으로 비트 단위를 분리할 수 있다.
#pragma warning(disable: 4996)
#include <stdio.h>
// 비트 단위 정보를 다룰 수 있도록 구조체를 선언 (총 1바이트)
// 구조체 멤버 하나하나가 1비트
struct BitType {
unsigned char bit_0 : 1;
unsigned char bit_1 : 1;
unsigned char bit_2 : 1;
unsigned char bit_3 : 1;
unsigned char bit_4 : 1;
unsigned char bit_5 : 1;
unsigned char bit_6 : 1;
unsigned char bit_7 : 1; // 최상위 비트 (MSB)
};
int main(void) {
struct BitType data;
// 리틀 엔디안 기준
// data -> 0x05, 0000 00101 비트 구조가 된다.
data.bit_0 = 1;
data.bit_1 = 0;
data.bit_2 = 1;
data.bit_3 = 0;
data.bit_4 = 0;
data.bit_5 = 0;
data.bit_6 = 0;
data.bit_7 = 0;
printf("%d\n", data);
/*
// 오류 발생: data는 BitType 구조체로 만든 변수
unsigned char tmp;
tmp = data;
// 오류 발생: 데이터 형식이 달라서 형 변환에 실패
tmp = (unsigned char)data;
// 성공: data 변수의 시작 주소에서 tmp변수의 시작 주소로 1바이트 크기만큼 메모리 복사
// 허나 고작 1바이트를 복사하겠다고 memcpy함수를 사용하는 것은 적절히 않아 보임
memcpy(&tmp, &data, 1);
*/
return 0;
}
구조체 비트 분리 기능을 사용한 변수는 다른 일반 변수와 값을 주고 받기 어렵다.
허나 공용체를 사용하면 가능하다.
공용체를 사용하여 좀 더 편한 비트 단위 분리하기의 예제
#pragma warning(disable: 4996)
#include <stdio.h>
// 비트 단위 정보를 다룰 수 있도록 구조체를 선언 (총 1바이트)
// 구조체 멤버 하나하나가 1비트
struct BitType {
unsigned char bit_0 : 1;
unsigned char bit_1 : 1;
unsigned char bit_2 : 1;
unsigned char bit_3 : 1;
unsigned char bit_4 : 1;
unsigned char bit_5 : 1;
unsigned char bit_6 : 1;
unsigned char bit_7 : 1; // 최상위 비트 (MSB)
};
// 1바이트의 자료형
union BitData {
struct BitType bit_data;
unsigned char byte_data;
};
int main(void) {
union BitData tmp;
tmp.byte_data = 0x63;
printf("byte_data: %x\n", tmp.byte_data);
printf("bit_data: %d%d%d%d %d%d%d%d\n",
tmp.bit_data.bit_7, tmp.bit_data.bit_6, tmp.bit_data.bit_5, tmp.bit_data.bit_4,
tmp.bit_data.bit_3, tmp.bit_data.bit_2, tmp.bit_data.bit_1, tmp.bit_data.bit_0);
return 0;
}
// 결과
/*
byte_data: 63
bit_data: 0110 0011
*/
공용체 문법을 사용하면 메모리를 강제로 복사하지 않고 문제를 해결할 수 있다.
공용체는 메모리를 공유한다. 따라서 위와 같이 tmp.byte_data 요소에 0x63 값을 대입하면, 메모리를 공유하는 tmp 변수의 bit_data 요소에도 비트 단위로 값을 대입한 것과 같다.
사용법은 조금 더 쉬워지지만 연산 능력은 비트 연산자가 더 좋다.
'Programming > C' 카테고리의 다른 글
[Programming/C] 리다이렉션 이용 예제 (stdout, stderr, stdin) (0) | 2020.06.17 |
---|---|
[Programming/C] 포인터를 이용한 문자열 리버스 (0) | 2020.06.17 |
[Programming/C] 공용체 (union) (0) | 2020.06.16 |
[Programming/C] 콜백 함수 (0) | 2020.06.16 |
[Programming/C] 함수 포인터(Function Pointer) (0) | 2020.06.16 |
Comments