'논리연산자'에 해당되는 글 1건

임베디드에서 자주 사용되는 연산 - 2009/02/09 17:03

제목처럼 임베디드에서 자주 사용되는 비트 연산자들을 정리해 봅니다.

이외에도 ~, ^ 등의 연산자들이 있겠으나 금번 칼럼에서는 <<, >> 연산자 ,  &= [~], |= 연산자 이처럼 딱 몇 개만 다룹니다.


<< , >> 쉬프터

<<, >> 연산자는 비트 조작을 수행하며 크게 2가지 방법으로 대개 사용됩니다. 로케이터곱하기/나누기가 그것입니다.

▶로케이터
비트의 위치 선정
예1) rGPECON = (0x1<<3);
예2) rGPECON >>= 16; // select upper byte 16

해설: 예제에서도 알 수 있다시피 어떤 값(비트)를 비트 이동 시키는 기능입니다. (예1)에서는 레지스터(rGPECON)의 특정 비트를 '1'로 만드는 일을 수행하고 있습니다. 다음으로 (예2)에서는 32비트 레지스터인 rGPECON 의 상위 16비트만을 취하는 방법으로 해당 연산자가 사용되고 있어 (예1)과 (예2)는 그 사용 용도가 약간의 차이가 있음을 또한 알 수 있습니다.


▶곱하기/나누기
정수배의 산술 곱하기/나눗셈
예1) SUM <<= 2; // multiply by '4'
예2) SUM =  value >> 1; // divide by '2'

해설: 이번 (예1)에서는 SUM 이라는 변수를 해당 연산자('<<') 을 사용하여 자리 이동 시킴으로써 실제로 곱하기 효과( 2^2 ; 2의 2승 )를 일으키고 있습니다.

한편, (예2)에서는 연산자('>>') 을 사용하여 반대로 나눗셈 효과( 2로 나눈 결과 )가 일어 나게 됩니다.


'&= '와 '|= '   마스커


이제부터 살펴 볼 연산자들은 특정 비트를 '0' 으로 만들기도 하고 '1'으로 만들기도 하는 기능들을 수행 합니다.

▶&= [~]
선택된 비트 패턴 '클리어(zero fill 마스킹)'
예1) rGPECON &= ~((0x3<<22) | (0x3<<24));
예2) rGPECON &= 0xFFFF0000;

해설: (예1)에서는 22번, 23번 비트를 무조건 '0'으로 만들고 24번, 25 비트를 무조건 '0'으로 만드는 일을 수행합니다. (예2)는 0번 비트부터 15번 비트까지를 모두 '0'으로 만드는 일을 수행합니다. (예1)과 (예2)는 둘다 특정 비트들을 '0'으로 만드는 일을 수행하나 (예1)은 ~ 연산자가 같이 사용된다는 점이 차이점이겠습니다. (예1)과 (예2) 모두 즐겨 반복적으로 사용되는 유형이므로 이에 아직 익숙치 않은 분들은 아예 유형 자체를 암기를 해도 좋을듯 싶군요.


▶|=
선택된 비트 패턴 '세트(기록)'
예1) rGPEDAT |= (0x1<<11) | (0x1<<12);
예2) rGPEDAT |= 0x00ff0000; ('1' fill 마스킹)

해설: &= [~] 연산이 특정 비트를 '0'으로 만드는 것이었다면 이번에 설명할 연산자는 이와 반대로 특정 비트를 무조건 '1'로 만드는 일을 수행합니다. 자, 예를 보도록 하죠. (예1)에서는 11번, 12번 비트를 무조건 '1'으로 만듭니다. (예2)는 16번 비트부터 23번 비트까지를 모두 '1'으로 만드는 일을 수행합니다.


Posted by 가일[GUILE]

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->
 

Trackback Address :: http://www.hongikcom.com/trackback/19 관련글 쓰기
  • 이 글을 적고 있는 지금와서는 내가 당시 SDK 을 정확히 이해 못해서 그랬던 것으로 생각하고 있고, 믿고 싶지만 어쨋든 당시에는 심각한 문제였다. 늘 상 그렇듯이. . .

Name
Password
Homepage
Secret