
위 그림은 16비트를 사용해서 여러 가지 데이터를 기억시키려고 합니다.
먼저 성별만 처리를 해 보겠습니다.
위 그림에서 성별만 bit 15의 위치에 기억시킨다고 하면 한 비트라서 0아니면 1로 구분할 수 있습니다.
남자면 1을 입력받고 여자면 2를 입력받으므로 입력을 받으면 1을 빼서 저장하면 됩니다.
<<와 >> 연산은 비트를 원하는 만큼 이동시키는 명령입니다.
그리고 비트 AND 연산은 &를 사용하면 다른 비트들을 모두 0으로 지울 수가 있게 됩니다.
그 다음에 출력을 할 때에는 다시 1을 더해서 출력하면 됩니다.
#include<stdio.h>
int main(void)
{
int num;
unsigned short int info = 0;
printf("성별 입력:(남1: , 여:2");
scanf("%d", &num);
info |= ((num - 1) << 15);
printf("성별: %d\n", ((info >> 15) & 1) + 1);
return 0;
}
이제 학년을 처리해 보겠습니다.
학년은 두 비트를 사용하므로 00, 01, 10, 11 네 가지 중의 하나를 기억시킬 수 있습니다.
00일때는 1학년, 01일때는 2학년, 10일때는 3학년 11일때는 4학년이라고 정하겠습니다.
입력받은 것을 하나를 빼서 저장한 다음에 출력할 때에는 하나를 크게 해서 출력을 하면 되겠군요.
#include<stdio.h>
int main(void)
{
int num;
unsigned short int info = 0;
printf("학년 입력:");
scanf("%d", &num);
info |= ((num - 1) << 13);
printf("학년: %d\n", ((info >> 13) & 3) + 1);
return 0;
}
그 다음 점수와 학번은 굳이 1을 빼거나 더해서 처리를 하지 않아도 됩니다.
★ 점수
#include<stdio.h>
int main(void)
{
int num;
unsigned short int info = 0;
printf("점수 입력:");
scanf("%d", &num);
info |= num << 6;
printf("점수: %d\n", (info >> 6) & 0x3f);
return 0;
}
★ 학번
#include<stdio.h>
int main(void)
{
int num;
unsigned short int info = 0;
printf("학번 입력:");
scanf("%d", &num);
info |= num;
printf("학번: %d\n", info & 0x3f);
return 0;
}
이제 위 4개의 소스를 합쳐놓으면 다음과 같이 됩니다.
#include<stdio.h>
int main(void)
{
int num;
unsigned short int info = 0;
printf("성별 입력:(남1: , 여:2");
scanf("%d", &num);
info |= ((num - 1) << 15);
printf("학년 입력:");
scanf("%d", &num);
info |= ((num - 1) << 13);
printf("점수 입력:");
scanf("%d", &num);
info |= num << 6;
printf("학번 입력:");
scanf("%d", &num);
info |= num;
printf("성별: %d\n", ((info >> 15) & 1) + 1);
printf("학년: %d\n", ((info >> 13) & 3) + 1);
printf("점수: %d\n", (info >> 6) & 0x3f);
printf("학번: %d\n", info & 0x3f);
return 0;
}
원문은 네이버 검색을 통해 http://cafe.naver.com/cafec/28918 에서 정보를 얻었습니다.