[C] 비트 연산자 (<<, >>, &, |, xor, ~)
- 비트 연산자란?
비트 단위로 연산이 진행될 때 사용하는 연산자이다.
쉬프트 <<, >> 을 사용한다.
- << (왼쪽 쉬프트)
unsigned char byte = 1; // 0000 0001
byte << 1; // 왼쪽으로 한 칸 이동, 0000 0010
각각이 한칸씩 올라가기 때문에 전체는 두 배가 된것이다.
byte <<= 1; // 왼쪽으로 쉬프트 한 것을 대입받는다. byte = byte << 1;
byte <<= 3; // 3배 증가
값은 2^n 배수
- >> (오른쪽 쉬프트)
unsigned char byte = 13; // 0000 1011
byte >>= 1; // 0000 0101
값은 2^n 나눈 몫
- 비트 곱(&), 합(|), xor(^), 반전(~)
두 변수를 비트 단위로 비트끼리 연산한다.
- & 은 두 비트가 둘 다 1이면 1, 둘 중 하나라도 0이 있으면 0
- | 은 둘 중 하나라도 1이 있으면 1, 둘 다 0이면 0.
- xor 은 두 비트가 같으면 0, 다르면 1
- ~ 1101 0101 은 0010 1010이 된다. (1 -> 0, 0 -> 1)
- 상태 체크 예시
#define HUNGRY 0x1 // ~ 앞 생략 0001
#define THIRSTY 0x2 // ~ 앞 생략 0010
#define TIRED 0x4 // 비트 단위로 쓸거라 3대신 4를 넣었다. // ~ 앞 생략 0100
#define FIRE 0x8
#define COLD 0x10 // 16이다.
#define POSION 0x20 // 32이다.
// 16진수는 1~F 까지 있다. '0x숫자' 로 표현한다.
int iStatus = HUNGRY;
iStatus |= HUNGRY; // 비트를 합쳐서 다른 곳을 고치지 않은 채로 상태를 합침
iStatus |= THIRSTY;
- 내 상태가 목마른가?
if (iStatus & THIRSTY) // 둘 다 1일 때만 1이 나온다. THIRSTY 0010이 있으면 1부분이 겹쳐서 if 문 수행
{
}
- 피곤함(TIRED) 상태를 해제한다. 그런데 애초부터 피곤함이 아니면?
xor을 쓸 경우 피곤함 상태였다면 피곤함을 해제시켰겠지만, 피곤함이 아니었다면 피곤함이 추가되는 문제 발생
- 특정 자리 비트 제거
iStatus &= ~THIRSTY;
상태는 그대로 두고, 제거할 상태를 비트 반전 시킨다. 그런 다음 곱 연산을 하면 상태 부분이 무조건 0으로 내려온다.
예시)
iStatus 1110 1010
~THIRSTY 1111 1101
1110 1000
iStatus 에서 0인 경우에도 둘 다 0이기 때문에 곱 연산시 0이 내려온다. 이 코드를 봤을 때 '비트를 빼겠다는 거구나'라고 바로 알아차릴 수 있도록 외워두자.
'공부 > C, C++' 카테고리의 다른 글
[C] 배열 (0) | 2022.01.01 |
---|---|
[C] 재귀 함수(2), 피보나치 수열 (0) | 2022.01.01 |
[C] 재귀 함수(1) , Factorial 함수 (0) | 2021.12.30 |
[C] 반복문(for, while), continue, break (0) | 2021.12.29 |
[C] 전처리기(Preprocessor), #define (0) | 2021.12.28 |
댓글