Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- php
- JavaScript
- DP
- server
- Algorithm
- 백준
- BASIC
- C
- BOJ
- C언어
- BFS
- programmers
- Cleancode
- sorting
- graph
- 따라하면서 배우는 C언어
- 따배씨
- Python
- Algospot
- 인프런
- 정수론
- greedy
- 종만북
- 생활코딩
- udemy
- Math
- dfs
- 따라하며 배우는 C언어
- String
- web
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 15.10 비트필드의 사용방법 본문
따배씨 - 따라하며 배우는 C언어
15강 비트 다루기
15.9 15.10 비트필드의 사용방법
#include <stdio.h>
#include <limits.h>
#include <stdbool.h>
void char_to_binary(unsigned char uc)
{
const int bits = CHAR_BIT * sizeof(unsigned char);
for (int i = bits - 1; i >= 0; i--)
{
printf("%d", (uc >> i & 1));
}
}
void print_binary(char* data, int bytes)
{
for (int i = 0; i < bytes; i++)
{
char_to_binary(data[i]);
}
printf("\n");
}
int main()
{
struct items {
bool has_sword : 1; // : number means bits to use!
bool has_shield : 1; // 1bit 크기의 bool type
bool has_potion : 1;
bool has_guntlet : 1;
bool has_hammer : 1;
bool has_key : 1;
bool has_ring : 1;
bool has_amulet : 1;
} items_flag;
items_flag.has_sword = 1; // flags = flags | MASK_SWORD;
items_flag.has_shield = 1;
items_flag.has_potion = 0;
items_flag.has_guntlet = 1;
items_flag.has_hammer = 0;
items_flag.has_key = 1;
items_flag.has_ring = 1;
items_flag.has_amulet = 1;
printf("Size = %zd\n", sizeof(items_flag));
// Size = 1
print_binary((char *)&items_flag, sizeof(items_flag));
// 11001011
if (items_flag.has_key == 1)
printf(">> You can enter.\n");
// >> You can enter.
union{
struct items bf;
unsigned char uc;
} uni_flag;
uni_flag.uc = 0;
uni_flag.bf.has_amulet = true;
uni_flag.uc |= (1 << 5);
print_binary((char*)&uni_flag, sizeof(uni_flag));
// 10100000
uni_flag.bf.has_key = false;
print_binary((char*)&uni_flag, sizeof(uni_flag));
// 10000000
return 0;
}
union{
struct items bf;
unsigned char uc;
} uni_flag;
uni_flag.uc = 0;
- structure 를 이용하여 bit-fields 로 사용
- union 을 이용하여 초기화를 쉽게 함
#include <stdio.h>
#include <limits.h>
#include <stdbool.h>
int main()
{
struct file_time {
unsigned int seconds : 5; // 2^5 = 32, 0 ~ 30*2 seconds
unsigned int minutes : 6; // 2^6 = 64, 0 ~ 60 minutes
unsigned int hours : 5; // 2^5 = 32, 0 ~ 23 hours
};
struct file_date {
unsigned int day : 5; // 2^5 = 32, 1 ~ 31 day
unsigned int month : 4; // 2^4 = 16, 1 ~ 12 month
unsigned int year : 7; // 2^7 = 128, 1980 ~ years
} fd;
/* 1988 12 28 */
fd.day = 28;
fd.month = 12;
fd.year = 8;
printf("Day %u, Month %u Year %u,\n", fd.day, fd.month, fd.year);
// scanf("%d", &fd.day); /* Warning */
return 0;
}
struct file_time {
unsigned int seconds : 5; // 2^5 = 32, 0 ~ 30*2 seconds
unsigned int minutes : 6; // 2^6 = 64, 0 ~ 60 minutes
unsigned int hours : 5; // 2^5 = 32, 0 ~ 23 hours
};
struct file_date {
unsigned int day : 5; // 2^5 = 32, 1 ~ 31 day
unsigned int month : 4; // 2^4 = 16, 1 ~ 12 month
unsigned int year : 7; // 2^7 = 128, 1980 ~ years
};
- 파일이 생성 될때, 시간 / 날짜를 Bits-Fields 를 이용하여 최적화 표기 가능
// scanf("%d", &fd.day); /* WRONG */
- Bits-Fields 는 bit 단위로 메모리를 사용하기 때문에, 주소의 최소 단위인 1Byte 의 연산이 불가능 함
- scanf 는 입력 값이 저장될 공간 위치를 주소값으로 지정
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 15.12 메모리 줄맞춤 alignof, alignas (0) | 2021.07.29 |
---|---|
[따배씨] 15.11 비트필드의 패딩 (0) | 2021.07.29 |
[따배씨] 15.9 구조체 안의 비트필드 (0) | 2021.07.27 |
[따배씨] 15.8 RGBA 색상 비트 마스크 연습문제 (0) | 2021.07.25 |
[따배씨] 15.7 비트단위 연산자의 다양한 사용법 (0) | 2021.07.25 |
Comments