본문 바로가기
ios 뽀개기/C언어

비트연산

by 인생여희 2019. 11. 18.
반응형
#include <stdio.h>
 
//3단계 변수의 특정 비트를 0으로 만드는 예제
//dest_data 변수의 bit_num 번째 있는 비트를 0으로 설정하는 함수로 해당 비트가 0으로 설정된 값을 반환한다.
unsigned char ResetBit (unsigned char dest_data , unsigned char bit_num){
 
    //1바이트 변수라서 비트 이동은 0~7 까지 가능함
    if (bit_num < 8) {
        dest_data = dest_data & ~(0x01 << bit_num);
    }
 
    return dest_data;
}
 
 
//3단계 : 변수의 특정 비트를 1로 만드는 예제
unsigned char setBit(unsigned char dest_data, unsigned char bit_num){
    /* 1바이트 변수라서 비트 이동은 0~ 7까지 가능*/
    if (bit_num < 8) {
        dest_data = dest_data | (0x01 << bit_num);
    }
 
    return  dest_data;
}
 
//3단계 변수의 값을 2진수 형태로 확인하는 예제
//dest_data 변수의 bit_num 번째 비트 값을 반환하는 함수
unsigned char GetBit(unsigned char dest_data, unsigned char bit_num){
    unsigned char bit_state = 0;
 
    /* 1바이트 변수라서 비트 이동은 0 ~ 7 까지만 가능*/
    if (bit_num < 8) {
        bit_state = dest_data & (0x01 << bit_num);
        bit_state = bit_state >> bit_num;
    }
 
    /* bit_num에 지정한 비트 값을 반환함 */
 
    return bit_state;
}
 
 
 
int main(int argc, const char * argv[]) {
 
 
    //####################### 비트단위 연산과 비트 패턴 #############################
 
    //c언어에서 제공하는 자료형의 최소 단위는 1바이트 이다.
    //0,1 중 하나를 저장하더라도 1바이트 저장공간을 사용해야 한다...
    //but 비트 연산자를 알면 가능하다.
    unsigned char lamp_state = 0;     /* 기본값은 전등이 꺼져 있음 */
    lamp_state = 1;                 /* 전등이 켜지면 1로 변경함 */
 
 
 
    //부호 없는 1바이트 변수를 선언하고, 그 변수에 16진수 값 5A로 초기화 하는 코드.
    //16진수 한자리는 4비트.
    unsigned char data = 0x5A;      /* 2진법 : 0101 1010 , 10진수 : 90*/
    printf("%d \n" , data);           //90
 
 
 
    //시프트 연산자
    //오른쪽에서 왼쪽으로 이동
 
    unsigned char l_data = 0x1A;        /* 이동전 : 0001 1010 */
    printf("%d \n" , l_data);          //26
    l_data = l_data << 2;            /* 이동후 : 0110 1000*/
    printf("%d \n" , l_data);          //104 (26에 2의 2승을 곱한것과 같다.)
 
    //왼쪽에서 오른쪽으로 이동
    unsigned char r_data = 0x1A;        /* 이동전 : 0001 1010*/
    printf("%d \n" , r_data);          //26
    r_data = r_data >> 2;            /* 이동후 : 0000 0110*/
    printf("%d \n" , r_data);          //6 (26에 2의 2승을 나눈것과 같다.)
 
 
    //변수에 부호가 있는경우 : 부호비트가 1이면 이동한 빈 공간에 1로 채우고, 부호비트가 0이면 이동한 공간에 0으로 채운다.
    char my_data = 0x85;
    my_data = my_data >> 3;
 
 
    //지정한 비트를 0으로 설정하기 : and 연산자 사용. 한쪽 비트가 0이면 다른쪽 비트 상관없이 0
    //1단계 - 2번 비트를 0으로 설정하기
    unsigned char l_a;        /*어떤 값이 들어있는지 알 수 없다.*/
    l_a = l_a & 0xFB;       /* 2번 비트만 0으로 변경함 , FB : 1111 1011 (2번째 비트만 0으로 설정후 and 연산)*/
    printf("%d \n" , l_a);   /* 2번째 비트만 0으로 변경됨*/
 
 
    //2단계 - 임의의 비트를 0으로 설정하기 : 16진수 0xFB를 직접 명시하지 않고 2번이라는 정보만 가지고 만들기
    unsigned char l_b;                          /* 어떤 값이 있는지 알 수 없음 */
    unsigned char bit_num = 2;                  /* 0으로 만들 비트의 번호 */
    unsigned char mask = ~(0x01 << bit_num);     /* 2번 비트로 1을 옮기고 비트를 반전시킴 */
 
    l_b = l_b & mask;                         /* l_b 의 2번째 비트만 0으로 변경됨*/
 
 
    //3단계 함수로 만들어 보기
    unsigned char sample_data = 0x7F;       /* 2진수 : 0111 1111*/
    printf("%X ->" , sample_data);          /* 값 변경전 출력*/
    //변수의 3번째 비트를 0으로 설정함.
    sample_data = ResetBit(sample_data, 3);
    printf("%X \n" , sample_data);          /* 값 변경후 출력*/
    //7F ->77
 
 
 
    //지정한 비트를 1로 설정하기 : or 사용. 한쪽 비트가 1이면 다른쪽 비트값에 상관없이 1
    //1단계 : 2번비트를 1로 설정하기
    unsigned char sample_data1;                 /* 어떤값이 있는줄 알수 없음 */
    sample_data1 = sample_data1 | 0x04;       // 변수의 2번비트만 1로 변경
 
    //2단계: 0x04를 직접 명시하지 않고 2번 비트라는 정보만 가지고 만들어본다.
    unsigned char sample_data2;
    unsigned char bit_num_new = 2;                      /* 1로 만들 비트의 번호 */
    unsigned char mask_new = 0x01 << bit_num_new;        /* 0x04 */
    sample_data2 = sample_data2 | mask_new;          /* 2번 비트만 1로 변경함*/
 
 
    //3단계 함수로 만들어보기: 특정 비트를 1로 만드는 예제
    unsigned char my_a_data = 0x77;         /* 2진수로 0111 0111*/
    printf("%X -> " , my_a_data);           /* 값 변경전 출력*/
    my_a_data = setBit(my_a_data, 3);      /* 변수의 3번째 비트를 1로 설정함*/
    printf("%X \n" , my_a_data);          /* 값 변경후 출력*/
    //77 -> 7F
 
 
 
 
    //특정비트 값 얻기 : 변수의 비트 패턴에서 특정 비트의 값을 얻고 싶으면 비트 and 연산자를 사용한다.
    //얻고 싶은 비트 값만 1로 넣고 나머지 비트는 모두 0을 넣어서 숫자를 만들고 and 연산을 하면된다.
    //1단계
    unsigned char a;
    unsigned char bit_state;            /*2번 비트의 값을 저장할 변수 */
    bit_state = a & 0x04;             /* a의 2번 비트만 값을 유지한 상태로 bit_state에 저장함  0x04 : 0000 0100*/
    bit_state = bit_state >> 2;     /* bit_state의 값을 0또는 1로 확인가능*/
 
 
    //2단계 : 임의의 비트 값 얻기
    unsigned char my_data2;
    unsigned char my_bit_num = 2;                   /* 1로 만들 비트 번호*/
    unsigned char my_bit_state;                     /* 비트의 값을 저장할 변수 */
    unsigned char my_mask = 0x01 << my_bit_num;     /* 비트 옮긴 후 값은 0x04*/
    my_bit_state = my_data2 & my_mask;          /* my_data2의 2번 비트만 값을 유지한 상태로 my_bit_state에 저장함*/
    my_bit_state = my_bit_state >> my_bit_num;  /* 0 또는 1로 확인가능 */
 
    //3단계 : 변수의 값을 2진수 형태로 확인하는 예제
 
    int i;
    unsigned char data_state = 0x75;                /* 2진수 : 0111 0101*/
    unsigned char l_bit_state;
    //8개의 비트 값을 모두 출력하기 위해 8번 반복함
    for (i = 0; i < 8; i++) {
 
        l_bit_state = GetBit(data_state, 7 - i);
 
        /* 비트 값을 출력함 */
        printf("%d " , l_bit_state);
    }
 
    //비트값이 모두 출력되면 줄바꿈
    printf("\n");                           //0 1 1 1 0 1 0 1
 
 
 
    //보수를 이용해서 덧셈으로 뺄셈 이용하기
    /*
     255를 0으로 만드는 숫자를 찾는방법
     1111 1111 (255)
        (비트반전)
     0000 0000 (0) - 1의 보수
 
        ( +1)
     0000 0001 (1) - 2의 보수
 
 
 
     198을 0이 되도록 숫자를 찾는법
     1100 0110 (198)
        (비트반전)
     0011 1001 (57) - 1의 보수
        (+1)
     0011 1010  (58) - 2의 보수
 
     */
 
 
 
    return 0;
}
 
 
 
 
 

 

복습

V        

do it c언어 책 참고

반응형

'ios 뽀개기 > C언어' 카테고리의 다른 글

표준입출력& 배열  (262) 2019.11.29
반복문 실습 - 별그리기  (130) 2019.11.19
자료형  (266) 2019.11.18
c언어 기초4  (614) 2019.05.22
c언어 기초 3  (597) 2019.05.21

댓글