레지스터는 비트마다 의미가 다르므로 옆 비트를 건드리지 않는 것이 전부다.
REG |= (1u << n); // 설정
REG &= ~(1u << n); // 해제
REG ^= (1u << n); // 토글
if (REG & (1u << n)) { } // 검사
여러 비트짜리 필드는 두 단계
REG = (REG & ~(0x3u << 4)) | (0x2u << 4); // 4~5번 비트를 0b10 으로
└ 지우고 ┘ └ 넣는다 ┘
지우지 않고 |= 만 하면 이전 값과 OR 되어 엉뚱한 값이 된다. 초보가 가장 자주 하는 실수다.
관용구
#define MASK(hi, lo) (((1u << ((hi) - (lo) + 1)) - 1) << (lo))
1 << n 에서 1 은 int 라 31비트를 넘기면 미정의 동작이다. 32비트 레지스터를 다룰 때는
1u 로 쓰는 습관이 필요하다.