임베디드 시스템과 펌웨어
위의 코드는 레지스터 reg의 여러 비트로 이루어진 설정 필드를 바꿔 쓰고 있습니다. 무엇을 하고 있습니까?
reg = (reg & ~(0x7 << 4)) | (5 << 4);
- A비트 5만 1로 만든다
- B비트 4~6의 3비트 필드를 0으로 만든 뒤 그곳에 5(2진수 101)를 넣는다
- Creg의 값을 5배로 한 뒤 4비트 왼쪽으로 시프트한다
정답과 해설 보기
정답: B. 비트 4~6의 3비트 필드를 0으로 만든 뒤 그곳에 5(2진수 101)를 넣는다
0x7은 2진수로 111이므로 '0x7 << 4'는 비트 4~6이 1인 마스크입니다. 그 부정과 AND를 취해 필드를 0으로 만들고, '5 << 4'(비트 4~6에 101)와 OR를 취하면 필드만 5로 바뀌고 나머지 비트는 원래 값 그대로 남습니다. 동작 모드나 분주비처럼 여러 비트로 하나의 설정을 나타내는 레지스터를 바꿔 쓸 때의 기본 형태입니다.