그라운드 임베디드 유튜브 구독

노트 / C 언어

비트 연산: 켜고, 끄고, 뒤집기

AND로 지우고, OR로 켜고, XOR로 뒤집고, 시프트로 자리를 옮깁니다. 레지스터 제어의 기본 문법입니다.

GROUND EMBEDDED · 정리 노트C 언어 09비트 연산 1reg |= (1u << n);// n번 비트 켜기 2reg &= ~(1u << n);// n번 비트 끄기 3reg ^= (1u << n);// n번 비트 뒤집기 4if (reg & (1u << n))// n번 비트 확인

레지스터 하나에는 기능이 다른 비트가 여러 개 들어 있습니다. 원하는 비트만 바꾸고 나머지는 그대로 두는 것이 비트 연산의 목적입니다.

네 가지 패턴

reg |=  (1u << n);    // n번 비트 켜기
reg &= ~(1u << n);    // n번 비트 끄기
reg ^=  (1u << n);    // n번 비트 뒤집기
if (reg & (1u << n))  // n번 비트 확인

여러 비트짜리 필드 바꾸기

모드처럼 2비트 이상인 필드는 먼저 지우고 새 값을 넣습니다.

reg = (reg & ~(0x3u << 4)) | (mode << 4);

시프트 주의점

  • 1 << 31은 부호 있는 int라 정의되지 않은 동작이 될 수 있습니다. 1u를 씁니다.
  • 부호 있는 음수를 오른쪽으로 밀면 컴파일러에 따라 부호 비트가 채워집니다.

읽고-바꾸고-쓰기

|=는 읽고, 바꾸고, 다시 쓰는 세 단계입니다. 중간에 인터럽트가 같은 레지스터를 바꾸면 그 변경이 사라집니다. STM32의 BSRR처럼 쓰기만으로 비트를 바꾸는 레지스터가 따로 있는 이유입니다.