기술탐구

[asm] and 연산으로 홀수 짝수 구별하기

appleii 2009. 9. 19. 11:12

홀수 짝수를 구별하는 방법은 여러가지가 있다. 보통의 경우, 나머지를 구하는 연산을 사용한다. 그러나 더 간단하게는 and 연산으로 구할 수도 있다.

다음과 같이 십진수와 2진수를 비교해 보자.

Decimal 0 1 2 3 4 5 6 7 8
Binary 0000 0001 0010 0011 0100 0101 0110 0111 1000
 
사용자 삽입 이미지

자세히 관찰해 보면 짝수의 경우는 LSB(Least Significant Bit)가 0이고, 홀수는 1이라는 것을 알 수 있다. 이것을 이용해 보면 LSB 가 0 인지 1인지만 확인할 수 있으면 짝수와 홀수를 간단하게 알아낼 수 있다.


and 연산으로 어떻게 마지막 자리수가 0 인지 1 인지 알아낼 수 있을까. 그것은 and 연산의 특성을 이용하는 것이다. and 연산은 입력값이 모두 1이어야 결과가 1이며 하나라도 0이면 결과는 0이다. 예를 들어 0000 과 0101 을 and 연산시켜 보자.

0000
0101 and
----------------
0000


둘 중 하나라도 0이면 0이다. 마지막 자리수만 확인하고 싶다면 0001 을 and 연산 시키면 된다.

0001
0101 and
----------------
0001


0001 과 and 연산시킨 결과가 0001 이다. 십진수로는 1이다. 0101 은 십진수로 5이다. 5는 홀수이다.

결론은 이렇다. 어떤수를 1과 and 연산시켜서 결과가 0이면 짝수, 1이면 홀수이다. 만약, eax 에 5가 들어있고 이 값이 홀수인지 짝수인지 알고 싶다면, and eax, 1 하면 된다. 연산결과 eax 에 1이 있으면 원래 있던 값은 홀수이다.

00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000001 and
-----------------------------------------------------------------
00000000 00000000 00000000 00000001



C언어를 기준으로 나머지를 구하는 연산은 % 이다. bitwise and 연산은 & 이다.  


C++ Builder 를 이용하여 두가지 연산을 사용한 결과를 디스어셈블 해보면 다음과 같이 나온다.

num = num % 2;

8B55FC           mov edx,[ebp-0x04]
81E201000080     and edx,0x80000001
7905             jns 0x004011a2
4A               dec edx
83CAFE           or edx,-0x02
42               inc edx
8955FC           mov [ebp-0x04],edx


num = num & 1; 

8365FC01         and dword ptr [ebp-0x04],0x01

연산 결과 변수 num 에 0 이 있으면 짝수이고, 1 이 있으면 홀수이다.