본문 바로가기

카테고리 없음

2일차(2023/2/18)-비트 연산자

연산자 공부에 이어 비트 연산자를 소개한다.

그 전에 배웠던 연산자는 피연산자 전체와 다른 피 연산자 전체끼리의 비교였다면,

비트 연산자는 각 피연산자들의 비트 단위로 쪼개어 연산을 수행하는 것이다.

1 2 3 4 5 6 7 8

1byte=8bit                                                                두개의 피연산자를 같은 숫자 비트끼리 비교연산하는 방식이다.

1 2 3 4 5 6 7 8
//전처리기: 모든 컴파일 과정 중 제일 먼저 실행됨.
//4byte=32bit, 각 자리수마다 상태 표현-> 32가지 상태 표현 가능

//2의 승수로 올라가는 중
#define HUNGRY 0x001
#define THIRSTY 0x002
#define TIRED 0x004
#define COLD 0x008
#define HOT 0x010 //16진수로 표현한 16(10진수)
#define POISON 0x020

int main(void) 
{
    //비트 연산자
    //시프트(<<, >>)비트를 왼, 오른쪽으로 한칸씩 밂.
    //11001100 -> << -> 10011000
    unsigned char byte = 1;
    byte<<=2;//00000001 -> 00000100 , byte=4, 2^n을 곱한 값
    byte >>= 1;//00000100->00000010, byte=2, 2^n으로 나눈 몫

    //비트 곱(&), 합(|), xor(^), 반전(~)
    
    //비트 곱(&): 비트 단위로 연산, 10110111&1111110 ->10110110       
    //각 8자리에 해당하는 비트끼리 연산, 비트 자리수에서 둘 중 하나라도 0이면 0, 둘 다 1이어야지만 1

    //xor(^): 각 비트 자리수에서 두 값이 같으면 0, 다르면 1, 즉 1^0=0^1=1이고 나머지는 다 0이다.
    
    //반전(~): ~1=0, ~0=1

    //전처리기 활용
    //왜 굳이 전처리기를 사용할까?
    //상태는 여러가지가  있는데, 상태의 값이 변경될 때, define부분만 변경해도 됨. 코드 유지보수가 수월함.
    //본질은 단순 숫자이지만, 가독성이 좋아짐.

    //상태 추가
    int iStatus = 0;
    iStatus |= HUNGRY;//iStatus에 HUNGRY(1) 더하기 , 00000001
    iStatus |= THIRSTY; // 00000010

    //상태 확인
    if (iStatus & THIRSTY)//해당 비트 자리가 둘 다 1일 때 1이 나와야 함.
    {
        //HP를 몇 줄인다.
    }


    //이 코드는 자주 보이니까 공식처럼 외워두기
    //특정 자리 비트 제거
    iStatus &= ~THIRSTY;//목마름 상태를 반전 시킨 것을 곱함. 
    //-> THIRSTY부분의 비트 상태가 0이 되면서, 곱하는 과정에서 해당 비트가 0이 됨. 나머지 부분은 그대로 유지됨.
 




    

    return 0;
}