unsigned char byte = 1;
=> 0000 0001
byte << 1; // 왼쪽으로 한 칸
=> 0000 0010
0000 1010 : 10
<< 1 // 1 비트 이동
0001 0100 : 20
byte <<= 1; : 왼쪽으로 이동하고 대입한다.byte = byte << 1;이 코드와 동일byte <<= 2; : 2칸 왼쪽으로 이동 4배 byte <<= 3; : 3칸 왼쪽으로 이동 8배byte >>= 1; // 1칸 오른쪽으로 이동 1/2
byte >>= n; : 2n을 나눈 몫각 비트의 자리에 대해서 두 값이 모두 1이면 1
1011 0111
1110 1111
1010 0111
각 비트의 자리에 대해서 두 값 중 하나만 1이어도 1
1011 0111
1110 1111
1111 1111
각 자리의 비트를 뒤집음
1011 0111
~ // 반전
0100 1000
두 각 자리의 비트가 같으면 0, 다르면 1
1. 두 비트가 같으면 1, 다르면 0으로 계산
2. 반전(~)시키기
1011 0111
1110 1111
0101 1000
#(전처리 구문)
#으로 시작하는 구문#define SOME_STATE 1
int iStatus = SOME_STATE; // 1이 들어감.
// define 전처리 구문에서 처리해둔 것.
#define BURN = 27
#define HUNGRY = 3
int iStatus = BURN;
iStatus = HUNGRY;
#define MAX_SIZE = 20;
// => 요구에 따라 40으로 변경
int capacity[MAX_SIZE];
#define HUNGRY 1
int iStatus = HUNGRY;
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0001 : 배고픈 상태
#define HUNGRY 1 // 배고픔 : 첫번째 칸 1
#define THIRSTY 2 // 갈증 : 두번째 칸 2
#define TIRED 4 // 피로 : 세번째 칸이어야 하므로 4가 들어감
#define ~~~ 8 // 다음칸~
0000 0000 0000 0000 0000 0000 0000 0001 : 배고픔
0000 0000 0000 0000 0000 0000 0000 0010 : 갈증
0000 0000 0000 0000 0000 0000 0000 0100 : 피로
~~
#define HUNGRY 1 // 배고픔 : 첫번째 칸 1
#define THIRSTY 2 // 갈증 : 두번째 칸 2
#define TIRED 4 // 피로 : 세번째 칸이어야 하므로 4가 들어감
unsigned int iStatus = 0;
0000 0000 0000 0000 0000 0000 0000 0000
// 배고픔 상태 부여
iStatus |= HUNGRY; // 비트 합 연산 대입
0000 0000 0000 0000 0000 0000 0000 0000 : iStatus
0000 0000 0000 0000 0000 0000 0000 0001 : HUNGRY
0000 0000 0000 0000 0000 0000 0000 0001 : 합 연산 결과
// 갈증 상태 부여
iStatus |= THIRSTY; // 비트 합 연산 대입
0000 0000 0000 0000 0000 0000 0000 0001 : iStatus
0000 0000 0000 0000 0000 0000 0000 0010 : THIRSTY
0000 0000 0000 0000 0000 0000 0000 0011 : 합 연산 결과
iStatus는 배고픔과 갈증 상태가 부여된 값임.if(iStatus & THIRSTY) // 비트 곱 연산
{
}
// 앞의 연산 직후 검사할 때
0000 0000 0000 0000 0000 0000 0000 0011 : iStatus
0000 0000 0000 0000 0000 0000 0000 0010 : THIRSTY
0000 0000 0000 0000 0000 0000 0000 0010 : 곱 연산 결과
=> 숫자로 표현하면 2
=> true: 0 이외의 모든 값.
=> 조건문은 true 반환
// 다른 경우
iStatus = HUNGRY;
iStatus & THIRSTY // 비트 곱연산 시,
0000 0000 0000 0000 0000 0000 0000 0001 : iStatus
0000 0000 0000 0000 0000 0000 0000 0010 : THIRSTY
0000 0000 0000 0000 0000 0000 0000 0000 : 곱 연산 결과
=> 숫자로 표현하면 0
=> false
1101 상태
1001 상태로 만들고 싶음. == 0100 상태를 제거하고 싶음.
1101
xor 0100 (같으면 0, 다르면 1)
1001
iStatus = THIRSTY;
iStatus &= ~THIRSTY;
0000 0000 0000 0000 0000 0000 0000 0010 : iStatus
1111 1111 1111 1111 1111 1111 1111 1101 : ~THIRSTY
0000 0000 0000 0000 0000 0000 0000 0000 : 비트 곱 결과
iStatus = HUNGRY;
iStatus |= THIRSTY;
0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0011
iStatus &= ~THIRSTY;
0000 0000 0000 0000 0000 0000 0000 0011 : iStatus
1111 1111 1111 1111 1111 1111 1111 1101 : ~THIRSTY
0000 0000 0000 0000 0000 0000 0000 0001 : 비트 곱 연산 => HUNGRY만 남음.
이 형태는 암기하는 것이 좋음
iStatus &= ~THIRSTY;
#define HUNGRY 1
#define THIRSTY 2
#define TIRED 4
#define FIRE 8
#define COLD 16
...
0x 16진수 숫자란 의미#define HUNGRY 0x1 // 1
#define THIRSTY 0x2 // 2
#define TIRED 0x4 // 4
#define FIRE 0x8 // 8
#define COLD 0x10 // 16 16진법이므로 16이 되면 다음 자리로 이동
#define POISON 0x20 // 32
#define POISON 0x40 // 64
#define POISON 0x80 // 128
#define POISON 0x100 // 256
#define POISON 0x200 // 512
#define POISON 0x400 // 1024
#define POISON 0x800 // 2048
...