Bitwise

비트 연산자 폭과 부호

&, |, ^, ~, shift는 정수의 표현 비트를 직접 만진다. 몇 비트를 쓰는지, 부호 확장이 끼는지, shift 범위가 유효한지 확인해야 한다.

01

비트 폭 결정

uint32_t처럼 폭이 고정된 타입을 쓰면 파일 포맷과 네트워크 값 해석이 안정된다.

02

마스크를 이름 붙인다

0x04 같은 숫자보다 Readable, Writable 같은 이름이 플래그 의미를 보존한다.

03

shift 입력을 제한한다

1u << n에서 n이 타입 폭보다 작은지 검사하지 않으면 정의되지 않은 동작으로 갈 수 있다.

AND
비트 검사와 제거 mask와 겹치는 비트만 남긴다.
(flags & mask) != 0으로 읽는다.
OR
비트 설정 특정 플래그를 켜되 다른 비트는 유지한다.
대입 연산 |=와 자주 결합된다.
XOR
토글과 차이 같은 비트는 0, 다른 비트는 1이 된다.
암호화처럼 말하면 과장이다.
SHIFT
자리 이동 왼쪽 shift는 곱셈처럼 보이지만 overflow와 폭 규칙이 중요하다.
unsigned 타입을 기본으로 둔다.

타입 폭 · shift 범위 · 가독성 점검

타입 폭 프로토콜이나 파일 포맷 값에 int 대신 고정 폭 타입을 쓰는가.
shift 범위 shift count가 음수이거나 타입 비트 수 이상이 되지 않는가.
가독성 마스크 상수가 이름 없이 흩어져 있지 않은가.

플래그 검사

constexpr std::uint32_t Read = 1u << 0;
constexpr std::uint32_t Write = 1u << 1;
const bool canWrite = (flags & Write) != 0;