10. 비트연산자 (2)

P4·2023년 6월 13일
0
post-thumbnail

비트연산자 (2)

  • int 자료형은 (4byte) 32bit, 이걸 이용해서 특정 상태를 표현할 수 있음

  • 상태이상 하나를 1비트라고 쳤을때 int 자료형 하나로 상태이상을 32개까지 동시에 중첩시킬 수 있음

  • ex) 첫번째 칸에 1이 들어가면 hungry, 두번째 칸에 들어가면 thirsty...

  • #define 해줄때는 1, 2, 4, 8...의 순서대로 가야함 (첫번째 두번째 세번째칸... 이렇게 사용하기 때문)

예시

#define HUNGRY 1;
#define THISTRY 2;
#define TIRED 4;

unsigned int iStatus = 0;

// 상태이상 넣어주기
iStatus |= HUNGRY;
iStatus |= THIRSTY; // 합 비트 연산자 |= <-- 둘중 하나만 1이면 1

// 상태이상 확인
// 곱연산을 사용하면 둘다 1인 것만 비교할 수 있음
if (iStatus & THIRSTY) {
    
}

만약 내가 원하는 상태이상만 빼주고 싶으면? (아래에 있는 특정 자리 비트 제거 참고)

  • 1101

  • 0100 이 있을때 xor --> ^ 연산자를 사용하면? (다르면 1, 같으면 0)

  • 1001 <-- 이렇게 빼주고 싶은 부분만 빠짐

  • 그런데 이렇게 사용하면 문제가 피곤한 상태를 빼줄 수는 있는데

  • 이전에 피곤해하지 않았다면 피곤한 상태를 넣어버림

  • 그래서? 먼저 &(곱) 연산으로 교집합을 확인해주고 그 상태이상이 있을 경우에만 xor연산을 수행

  • 근데 이런 불편한 방법보다 더 편리한 방법이 있음


특정 자리 비트 제거

iStatus &= ~THIRSTY; // 이건 외우면 됨, 꼭 외울것
// & (곱) = 둘다 1이어야 1
// ~ (반전) = 비트 뒤집기
  • 11101010 여기서 2번째 비트를 빼고싶다면?

  • 00000010 <-- THIRSTY는 이거

  • 11111101 <-- ~연산을 하면 이렇게 됨, 여기서 곱연산을 수행하면?

  • 11101000 <-- 원하는 비트만 쏙 빠짐, 원래 없었어도 0으로 내려옴


특정상태 define

  • 특정 상태에 숫자를 대응시켜도 되긴 하지만 보통은 16진수를 씀
#define HUNGRY 0x001;
#define THIRSTY 0x002;
#define TIRED 0x004;
#define FIRE 0x008;

#define COLD 0x010; // 16은 다음자리로 올라감
#define POISON 0x020;
#define asdasd 0x040;
#define asdasd2 0x080;

#define asdasd3 0x100;
#define asdasd4 0x200;
#define asdasd5 0x400;
#define asdasd6 0x800; // 이렇게 규칙적으로 올라가는 것을 확인 가능
profile
지식을 담습니다.

0개의 댓글