고양이와 코딩

[내가 헷갈려서 하는] 임베디드 FW 레지스터 제어 패턴 정리 본문

임베디드

[내가 헷갈려서 하는] 임베디드 FW 레지스터 제어 패턴 정리

ovovvvvv 2026. 2. 15. 16:22
728x90

업무를 하다보면, 그냥 앞서 짜여져 있는 코드를 따라 나도 비트 마스크, 시프트 연산을 마구 사용하지만

막상 남이 짠 연산 코드를 빨리 해석해서 공유해야 하는 상황이 오면 당황하게 된다 ....

 

사실 나는 컴퓨터가 아니기 때문에 왜 곱셈/나눗셈을 안하고 시프트 연산을 썼을까 .. 하면서 
1차로 함수 이름으로 어떤 연산을 하는지 추측하곤 한다 ^^ ㅋ 이렇게 하면 훨씬 쉬워지지만 ~ 

 

비트 연산도 결국 연산이니까 ,,, 어렸을때 곱셈 나눗셈 구몬 무한반복 했을때처럼 하면 좀 익숙해지지 않을까 싶어서 .. 

아무튼 시작

 

 1. 비트 제어 패턴

value |= (1U << 5);  // bit5 ON
value &= ~(1U << 3); // bit3 OFF

| 연산자는 또는(OR)니까, 같은 자리에 둘 중 하나만 1이어도 1이 된다! 

& 연산자는 그리고(AND)니까, 같은 자리에 둘 다 1이어야 1이 된다

 

=> 그러면 깊게 생각하지 말고, 1이 5자리 이동했고 | 연산이니까 5번 비트 자리는 무조건 1이 되겠군

      1이 3자리 이동했고 &연산 전에 ~으로 반전됐으니까 3번 비트 자리는 무조건 0이 되겠군

      그리고 다른 비트는 전혀 영향받지 않고 원래 그대로겠군

 

정리하면, 

  • 1을 5칸 왼쪽으로 이동하면 5번 비트만 1이고 나머지는 0인 값이 된다.
  • OR 연산은 1이 있는 자리를 1로 만들기 때문에, 5번 비트는 무조건 1이 된다.
  • 다른 비트는 0과 OR 연산을 하므로 기존 값이 그대로 유지된다.

 

  • 1을 3칸 왼쪽으로 이동하면 3번 비트만 1인 값이 된다.
  • 이를 ~ 연산으로 뒤집으면 3번 자리만 0이고 나머지는 모두 1이 된다.
  • AND 연산은 0과 연산된 자리를 0으로 만들기 때문에 3번 비트는 반드시 0이 된다.
  • 다른 비트는 1과 AND 되므로 기존 값이 유지된다.

 

 2. 비트 추출 패턴

value = (reg >> shift) & 0x1F;

(원본 >> 시작비트) & 마스크

0x1F = 0001 1111(bin)

 

예를 들어, reg = 1011 0110 1101 1000, shift = 4

reg >> 4 = 0000 1011 0110 1101

그리고 0x1F와 AND 연산을 하는데, 1F는 아래 다섯 비트만 1인 값이다!

 

     0000  1011  0110  1101

&   0000 0000 0001 1111

---------------------------

0000 0000 0000 1101

 

  • 먼저 reg >> shift를 통해 내가 보고 싶은 비트 구간을 오른쪽 끝으로 이동시킨다.
  • 그 다음 보고싶은 비트 구간이 1로 구성된 값과 &연산을 하면, 아래 n비트만 남기고 나머지는 모두 0이 된다.

'임베디드' 카테고리의 다른 글

[ARM Cortex-M3 완벽 가이드] - 내맘대로 정리..  (0) 2025.03.16
임베디드와 펌웨어  (1) 2024.05.09