2011년 10월 21일 Posted title : Bit 연산 쉽게 생각해보자.....

위 그림은 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  에서 정보를 얻었습니다.
Posted by 초록개미 | 2011/10/21 17:32 | My Project History | 트랙백
트랙백 주소 : http://pihksk.egloos.com/tb/1962198
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
※ 로그인 사용자만 덧글을 남길 수 있습니다.
◀ 이전 페이지 다음 페이지 ▶




by 초록개미
메뉴릿
카테고리
전체
My Life
My PC Life
My PDA Life
My Photo Life
My Project History
My Medical History
UNIX
GIS
미분류
최근 등록된 덧글
딴건 몰라도 pink- tou ..
by 쫑s at 05/08
감사합니다...
by 이상욱 at 02/11
아 해결했습니다. http:/..
by ㄱ at 07/19
CMD에서 레지스트리 ..
by ㄱ at 07/18
이름(v)이 (기본값)..
by ㄱ at 07/17
이눔도 블로그 하네.. ..
by K_Bloger at 08/12
최근 등록된 트랙백
라이프로그
메모장
null
이전블로그
2013년 09월
2012년 11월
2012년 07월
2012년 03월
2012년 01월
2011년 12월
2011년 10월
2011년 09월
2011년 07월
2011년 06월
2011년 01월
2010년 10월
2010년 05월
2010년 03월
2010년 01월
2009년 09월
2009년 08월
2009년 07월
2009년 06월
2009년 05월
2009년 04월
2009년 03월
2009년 02월
2008년 12월
2008년 11월
2008년 09월
2008년 07월
2008년 06월
2008년 04월
이글루링크
이글루 파인더

태그
필름 group sdo_geometry 액정 아이폰 보호 체험기 thePianoGuys spatial_index oracle optware 투피 슈퍼대디 사용자 TiffanyAlvord 리뷰 solaris newage 리얼룩 솔라리스 starwars polygon 레온 더피아노가이즈 spatial 티파니앨버드 그룹 sdo_geom_metadata 추가 point

skin by 에셈