제목이 이상한가??
ㅋㅋㅋ
어차피 이 글을 클릭하시는 분들은 C에대해 어느정도 자신감이 붙으신 분들이실테고 ㅋㅋㅋ
근데 ! 연산자와 ~연산자의 정확한 차이를 알고 계신감용???
헷갈리시는 분들 많으실겁니다 ㅋㅋㅋ
(1) ! 연산자
Logic NOT 입니다.
C 언어에서는 0 이 아닌 모든 수는 다 1로 생각하죠 ㅋㅋ LOGIC 적으로 말이에요 ㅋㅋ
단편적인 예로 if(3) 이렇게 써도 무조건 참으로 알고 돌자나영 ㅋ
! 연산자는 이렇듯 로직을 바꾸어주는 역할을 한답니다.
값을 바꾸는것이 아니라요 ㅋㅋ
예는 ~ 연산자와 함께 보여드리지요
(2) ~ 연산자
Bit Value NOT 입니다.
이해가 되시나영??
모든 수는 2진수로 저장됨은 알고 계시겠지요?/
각각의 비트에 들어갈수 있는 값은 1 아니면 0 입니다.
이 각각의 비트의 값을 반대로 바꾸는 것입니다.
(예제)
int main(void)
역어셈 코드 잠시 알아볼까요??
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배정도 차이가 나는군요~
물론 엄청 작은시간입니다 ㅋ 하지만 이런게 있다는것을 알아두는 것이 나쁘지는 않을듯 싶네요
ㅋㅋㅋ
어차피 이 글을 클릭하시는 분들은 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 입니다 ㅋㅋ
아래는 비교하기 위한 코드이고 그 아래에서 어셈코드 보시죠
[##_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_##]
}
(이해를 돕기 위해서 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배정도 차이가 나는군요~
물론 엄청 작은시간입니다 ㅋ 하지만 이런게 있다는것을 알아두는 것이 나쁘지는 않을듯 싶네요
'3. CortexM3 > 3-2. Embedded C-Code 의 최적화' 카테고리의 다른 글
제2강. if 문과 switch 문의 최적화 (0) | 2012.01.12 |
---|---|
제1강. C언어의 NOT 연산자 (!, ~) 의 차이와 최적화 (0) | 2012.01.11 |
이 챕터 강의를 시작하면서.... (0) | 2012.01.11 |