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

  1. 2012.01.11 제1강. C언어의 NOT 연산자 (!, ~) 의 차이와 최적화
크리에이티브 커먼즈 라이선스
Creative Commons License
제목이 이상한가??

ㅋㅋㅋ

어차피 이 글을 클릭하시는 분들은 C에대해 어느정도 자신감이 붙으신 분들이실테고 ㅋㅋㅋ

근데 ! 연산자와 ~연산자의 정확한 차이를 알고 계신감용???

헷갈리시는 분들 많으실겁니다 ㅋㅋㅋ

(1) ! 연산자

Logic NOT 입니다.
C 언어에서는 0 이 아닌 모든 수는 다 1로 생각하죠 ㅋㅋ LOGIC 적으로 말이에요 ㅋㅋ

단편적인 예로 if(3) 이렇게 써도 무조건 참으로 알고 돌자나영 ㅋ

! 연산자는 이렇듯 로직을 바꾸어주는 역할을 한답니다.

값을 바꾸는것이 아니라요 ㅋㅋ

예는 ~ 연산자와 함께 보여드리지요

(2) ~ 연산자

Bit Value NOT 입니다.

이해가 되시나영??

모든 수는 2진수로 저장됨은 알고 계시겠지요?/

각각의 비트에 들어갈수 있는 값은 1 아니면 0 입니다.

이 각각의 비트의 값을 반대로 바꾸는 것입니다.
 

(예제) 

 int main(void)
{
volatile unsigned int test_a = 10;
test_a = !test_a;


test_a =  ~test_a ;
}

(이해를 돕기 위해서 unsigned int 로했습니다. signed 로하면 부호가 바뀌겠지요?)

아래는 정답입니다.

 


아시겠지요????


여기서 제가 원래 이야기 하고 싶었던 부분은

LOGIC NOT 연산자의 최적화 입니다.

도대체 뭘 최적화 한다는 것이냐??

로직을 바꾸는데 ! 연산자를 쓸수도 있지만 ^ 연산자를 쓸수도 있습니다.
Exclusive OR 연산자 이지요~


1과 XOR 를 계속해주면 1,0,1,0 순서로 값이 반전됩니다.

과연 어떤 연산자를 써서 LOGIC NOT 을 하는 것이 더 빠를까요? ㅋㅋㅋ

일단 정답을 XOR 입니다 ㅋㅋ

아래는 비교하기 위한 코드이고 그 아래에서 어셈코드 보시죠 

int main(void)

{


volatile unsigned int test_a = 1;

test_a = !test_a;

test_a ^= 1;



[##_http://jbear.tistory.com/script/powerEditor/pages/1C%7Ccfile7.uf@196544404F0CE9551E0090.PNG%7Cwidth=%22363%22%20height=%22263%22%20alt=%22%22%20filename=%22dddddd.PNG%22%20filemime=%22image/jpeg%22%7C_##]

 역어셈 코드 잠시 알아볼까요??

MOVS(r4,#0x01) : r4 레지스터 1을 집어넣었군요

CBNZ : 0이거나 0이 아닌경우 비교 분기 (r4 는 피연산자가 들어가는 레지스터, 분기할 주소)
MOVS : r4 에 있던 값을  r0 레지스터로 옮기넹??
B : 다시 분기를 하는군요 0x080004C0 로 ㅋㅋ
MOVS : r0 에 0을 이동시켜놓고
MOV : r4 에다가 변화된 r0 를 이동시켜 놓으면서 ! 연산자 수행이 끝납니다

총 5개의 Instruction Set 을 돌았네용

아래는 ^ 연산자군요 ㅋㅋ

걍 EOR 하나죠? ㅋㅋ Exclusive OR 명령어 SET 을 가지고 있나바여 ㅋㅋ

아 참, 이 컴파일러는 uVision4 를 사용했습니다
Target CPU 는  ST 사에서 CortexM3 코어로 만든 STM32F103ZG 입니다

여튼 1개의 명령어로 끝나는군요 ㅋㅋ 

수행시간 차이를 볼까요??



! 연산자 : 4ns
^ 연산자 : 2ns

약 2배정도 차이가 나는군요~

물론 엄청 작은시간입니다 ㅋ 하지만 이런게 있다는것을 알아두는 것이 나쁘지는 않을듯 싶네요


저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by J.Bear


티스토리 툴바