[C++] 비트 연산과 비트 플래그, 비트 시프
비트 연산과 비트 플래그
인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다.
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!
비트 연산이란?
입력된 두 값을 비트 단위로 나열한 뒤에 비트 연산자로 연산한다. 비트 단위로 연산을 하며 각 자릿수의 연산은 독립적이여서 다른 자릿수의 연산에 영향을 주지 않는다.
언제 필요한가?
비트 단위의 조작이 필요할 때 사용. 대표적으로 Bitflag
비트 연산 종류
- ~ bitwise not
- & bitwise and
- | bitwise or
- ^ bitwise xor
NOT
두 입력값이 뒤바뀜. ->> 0은 1, 1은 0으로 뒤바뀌어 출력
AND
두 입력값이 모두 1 ->> 1을 출력
OR
하나 이상의 입력값이 1 ->> 1을 출력
XOR
입력값이 같지 않으면 ->> 1을 출력
비트 시프트
비트 시프트란?
비트를 좌우로 이동.
<< 비트 좌측 이동
- 비트열을 N만큼 왼쪽으로 이동
- 왼쪽의 넘치는 N개의 비트는 버림. 새로 생성되는 N개의 비트는 0.
- *2를 할 때 자주 보이는 패턴
>> 비트 우측 이동
- 비트열을 N만큼 오른쪽으로 이동
- 오른쪽의 넘치는 N개의 비트는 버림.
- 왼쪽 생성되는 N개의 비트는
- 부호 비트가 존재할 경우: 부호 비트를 따라감 (부호있는 정수라면 이 부분을 유의)
- 부호 비트가 없는 경우: 0으로 채워짐. ex. unsigned 타입
연산자 | 비트1 | 비트2 | 결과 | 연산 예시 | ||
NOT | ~ | 0 | 1 | 1010 1110 (174) -------------------~ 0101 0001 ( 65) |
||
1 | 0 | |||||
AND | & | 0 | 0 | 0 | 0010 0100 (36) 0000 0100 ( 4) ------------------& 0000 0100 ( 4) |
|
0 | 1 | 0 | ||||
1 | 0 | 0 | ||||
1 | 1 | 1 | ||||
OR | | | 0 | 0 | 0 | 0100 0001 (65) 0010 1000 (40) ------------------| 0110 1001 (105) |
|
0 | 1 | 1 | ||||
1 | 0 | 1 | ||||
1 | 1 | 1 | ||||
XOR | ^ | 0 | 0 | 0 | 0110 0001 (97) 0100 1011 (75) -----------------^ 0010 1010 |
|
0 | 1 | 1 | ||||
1 | 0 | 1 | ||||
1 | 1 | 0 | ||||
<< | << 1 | 0101 1010 | 1011 0100 | |||
>> | >> 1 | 1010 0101 | 0101 0010 |
코드
더보기
#include <iostream>
using namespace std;
unsigned char flag; // 부호를 없애야 >> 를 하더라도 부호비트가 딸려오지 않음
int main()
{
#pragma region 비트 연산
// int a = 1;
// int b = 123;
// a = a ^ b;
// a = a ^ b; //a값이 다시 1로 돌아옴.
// 실습
// 0b0000 [무적][변이][스턴][공중부양]
// 무적 상태로 만든다.
flag = (1 << 3); //값 8
// 변이 상태를 추가한다 (무적 + 변이)
flag |= (1 << 2); //값 4
// 무적인지 확인하고 싶다? (다른 상태는 관심 없음)
// bitmask
bool invincible = ((flag & (1 << 3)) != 0);
// 무적이거나 스턴 상태인지 확인하고 싶다면?
// bool mask = (1 << 3 | (1 << 1); 다른방식의 코딩 예시
bool stunOrInvincible = ((flag & 0b1010) != 0);
#pragma endregion
#pragma region 비트 플래그
#pragma endregion
}
'⭐ Programming > C++' 카테고리의 다른 글
[C++] 변수의 유효범위, 연산 우선순위, 타입 변환, 사칙연산 주의사항 (0) | 2022.03.20 |
---|---|
[C++] const, 메모리 구조 (0) | 2022.03.19 |
[C++] 비교 연산과 논리 연산 (0) | 2022.03.19 |
[C++] 산술연산 (0) | 2022.03.19 |
[C++] 문자와 문자열 (0) | 2022.03.19 |
댓글
이 글 공유하기
다른 글
-
[C++] 변수의 유효범위, 연산 우선순위, 타입 변환, 사칙연산 주의사항
[C++] 변수의 유효범위, 연산 우선순위, 타입 변환, 사칙연산 주의사항
2022.03.20 -
[C++] const, 메모리 구조
[C++] const, 메모리 구조
2022.03.19 -
[C++] 비교 연산과 논리 연산
[C++] 비교 연산과 논리 연산
2022.03.19 -
[C++] 산술연산
[C++] 산술연산
2022.03.19