336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
목표 )

비교 연산자를 쓰지 않고 두정수의 같은지 여부를 판별하는 함수를 만들어 본다.


소스 코드 : main.c

#include <stdio.h>


int compare(int source, int dest);


int main(void)

{

int value1 = 1;

int value2 = 2;

int value3 = 1;


int result1 = compare(value1, value2);

int result2 = compare(value1, value3);;


if (result1)

{

printf("value1 과 value2 값은 같습니다. %d \n", result1);

}

else

{

printf("value1 과 value2 값은 같지 않습니다. %d \n", result1);

}



if (result2)

{

printf("value1 과 value3 값은 같습니다. %d \n", result2);

}

else

{

printf("value1 과 value3 값은 같지 않습니다. %d \n", result2);

}


return 0;

}


int compare(int source, int dest)

{

return !(source - dest);// !(source ^ dest) xor 두비트가 같을때만 0을 리턴

}


결과1



이 코드는 비교연산을 사용하지 않습니다.


산술연산자와 비트 연산자 그리고 논리연산자 조합으로 만들어 젔습니다.

효율성윽 그닥 좋지 않습니다.

그래도 만들었으니 설명을 해보면 정수는 간단하게 자기 자신을 빼주면 0이 됩니다.

여기에 논리 연산자를 적용해서 0이면 1로 바꿔줍니다.

그리고 어떤한 값이 들어가게 되면 논리 연산자 NOT은 0으로 바꿔버리는 연산법칙이 있는 점을 이용하여

만들었습니다 . 조금더 발전 시키면!! !(source ^ dest을 사용하셔도 똑같은결과를 얻습니다!!

시스템 적으로 어떻게 좋을가요!!?! 당연 !(source ^ dest효율적인 연산 속도를 얻을 수있어요 

소스코드를 조금 수정하여



소스 코드 : main2.c

#include <stdio.h>

#include <windows.h>


#define MAX 100000000


int compare1(int source, int dest);

int compare2(int source, int dest);


int main(void)

{

int result1 = 0;


int value1 = 0;

int value2 = 0;


unsigned int time1 = 0;

unsigned int time2 = 0;

unsigned int time3 = 0;


int result2 = 0;


int count1 = 0;


time1 = GetTickCount();

while (count1 < MAX)

{

result1 = compare1(value1, value2);

count1++;

}


time1 = GetTickCount() - time1;


count1 = 0;


time2 = GetTickCount();


while (count1 < MAX)

{

result1 = compare2(value1, value2);

count1++;

}


time2 = GetTickCount() - time2;


count1 = 0;


time3 = GetTickCount();


while (count1 < MAX)

{

result2 = (value1 == value2);

count1++;

}


time3 = GetTickCount() - time3;


printf("compare1 : %d \n", time1);

printf("compare2 : %d \n", time2);

printf(" ==  : %d \n", time3);



return 0;

}


int compare1(int source, int dest)

{

return !(source ^ dest);

}


int compare2(int source, int dest)

{

return !(source - dest);

}



결과2



퍼포먼스차이가 분명있습니다.


그냥 비교연산자 쓰는것이 빠릅니다.


또다른 실험으로 ^ 만 사용하면  == 보다는 빠릅니다.

하지만 !을 붙이면 퍼포먼스가 같게 나옵니다.

대입 연산자를 못쓰는 상황에서

두수를 비교할때 가장 근접한 퍼포먼스를 보이는 방법은

!(value1 ^ value2) 을 해주면 된다로 결론이 나옵니다.

즉 (value1 == value2)와 거의 같은 수준의 퍼포먼스를 보입니다.

자세한 내막은 컴파일러만이 아는걸로 ~


#c언어, #c언어입문, #프로그램입문, #비교연산자안쓰고비교하기


+ Recent posts