연산자 공부에 이어 비트 연산자를 소개한다.
그 전에 배웠던 연산자는 피연산자 전체와 다른 피 연산자 전체끼리의 비교였다면,
비트 연산자는 각 피연산자들의 비트 단위로 쪼개어 연산을 수행하는 것이다.
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;
}