CPP_어소_11_비트 연산자(2)

CJB_ny·2022년 4월 29일
0

CPP_AROTHO

목록 보기
9/83
post-thumbnail

게임안에서 상태 설정하거나 유니티로 치면 레이어 같은거 찾을때!

하나의 값으로 내포된 의미가 많다!


이렇게 어떠한 상태를 32가지로 나타낼 수 있다.

이런 define정의하고

각자리에 대응해야되니까 TIRED = 8로 해주어야 3번째 비트 칸에 들어 갈 수 있다.

그다음 4번째 칸에 들어갈려면

#define watered = 16;

이렇게 해주어야 4번째 비트칸에 들어감

이러한 상태들을 중첩 시킬려면 우째야될까?

처음상태는 0으로 넣고

비트 연산을

int isStatus = isStatus | HUNGRY;

뭐 이런식임

그러면 '|' 연산자는 OR이라 둘중 하나 참이면 참이라 true반환 == 즉 1로 켜줌

상태 확인

if로 상태 확인 할 때

이렇게 되는것인데

만약 목마른 상태에서 물마셔가지고 물마셔가지고 목이 안마르니까

목마른 상태를 빼줄 수도있어야 될것이다.

XOR 같으면 0, 다르면 1 그런데 이까지 생각하는건 좋았는데

만약 이럴경우 위에 피곤함이 0인데 (3번쨰 비트칸)

밑에서 XOR연산을 해버리니까 오히려 피곤함을 넣어버림

논리곱으로 그런 상태가 있을때만을 if문으로 확인하고 이것을 XOR로 빼 주어야한다.

그리고 사실 비트를 뺄 때 XOR 안씀

보통

이렇게하면 조건 체크를 할 필요가 없다.

지금

동그라미 부분이 "목마름"이라면

그러면 목마르다는 부분은

이렇게 되는데

그러면 일단 반전 시켜가지고

이래됨.

그래서 & 연산하면 원래자리는 그대로 내려온다.

이부분은 0이랑 1이 만나서 0이 되어버림

이렇게

결국 이렇게 1이였던것만 0으로 빠지게됨

상태? 나열 할 때

이렇게 보통 안 쓰고 16진수로 쓴다.

그래서 숫자앞에 '0x'가 붙는다.

그런데 COLD의 경우 16 16진수에서 몇일까?

16진수가 1 2 3 4 5 6 7 8 9 a b c d e f
f = 15이다.

f에서 1이 더 더해지는 순간 다음자리로 넘어가게된다. -> 10 == 0x10 = 16이다.

16다음 32가 나와야 하는데 32는 16의 두묶음이라

#define COLD 0x10
#define POISON 0x20

이렇게됨.

#define COLD 0x01
#define COLD 0x02
#define COLD 0x04
#define COLD 0x08

#define COLD 0x10
#define COLD 0x20
#define COLD 0x40
#define COLD 0x80

#define COLD 0x100
#define COLD 0x200
#define COLD 0x400
#define COLD 0x800

이게 반복이 된다.

굳이 자리수 맞추자면은

이래됨

윈도우 프로그래밍

이런 버튼들이 있을 수도 있고 없을 수도있다.

이런거 버튼 상태값으로 만들어 놓음

그래서 하나의 값으로 내포된 의미가 존나 많다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글