※ 오늘 Daily Tip은
곽승주님이 제공해주신 내용입니다.
오늘의 내용은
간단하면서 의외로 생각하게 만드는 문제인 홀짝을 판단하는 일입니다.
'4'라는
숫자는 직관적으로 짝수라고 생각합니다. 왜?
2로 나누어 나머지가 0으로 떨어지니까?
VBA를 좀 아는 분들은 Mod 연산자를
떠올릴 겁니다. Mod 연산자는 두 수를 나누고 그
나머지를 반환합니다.
1.
첫 번째 방법
Sub
Even_Or_Odd()
Dim i As Long
For i =
1 To 100
If i Mod 2 Then
Debug.Print i & " is Odd"
Else
Debug.Print i & " is Even"
End If
Next
End Sub |
위의 프로시져에서
If i Mod 2 Then는 홀짝을 판단하는 부분입니다.
i Mod 2의 결과는 0(zero) 아니면
1입니다. 결과가
0(zero)이면 짝수라는 의미이고 1이면
홀수라는 의미합니다. 그래서
If식 안에서 결과가 0(zero)이면
거짓으로, 1이면 참으로 판단됩니다
(이는 VBA 뿐만 아니라 대개의 모든 언어가
그러합니다. 0(zero)이면
False이고 0(zero)이 아니면
True가 됩니다 )
이를 함수 형태로 만들어
보면 다음과 같습니다.
Function
IsOddNum(ByVal lngNumber As Long) As Boolean
IsOddNum = lngNumber Mod 2
End Function |
2.
두 번째 방법
서울 가는 길이 하나가
아니듯이 Mod 연산자 외에 다른 방법도 있습니다.
다음의 코드를 보면 정수 나누기(\)와
실수나누기(/)의 결과가 같은 지를 비교합니다.
짝수인 경우 두 가지의 나누기 결과가 0으로
같겠지만 홀수라면 다른 점을 이용한 것 입니다.
Function
IsEvenNum(ByVal lngNumber As Long) As Boolean
IsEvenNum = (lngNumber \ 2 = lngNumber / 2)
End Function |
3.
세 번째 방법
세 번째 방법은
And연산자를 이용합니다.
일전에 제가 And연산자가 논리연산자라기 보다는
비트연산자에 가깝다고 말한 적이 있습니다.[2003. 7. 27
뉴스레터 참고 -
AND 연산자가 논리연산자인가?]
Function
IsOddNum(ByVal lngNumber As Long) As Boolean
IsOddNum = lngNumber And 1
End Function |
위의 코드에서는 주어진
숫자와 1을 AND
비트연산을 합니다. 그래서 그 결과가 참이면
홀수 이고 아니면 짝수입니다.
10이라는 숫자를 이진수로 풀어보면
'00001010'입니다.
이것은 1(이진수로는
00000001)과
AND연산을 하면 그 결과는 모든 비트가 0이
됩니다. 따라서 최종적으로
0이 되며 이는 FALSE입니다.
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
AND |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
= |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
9를 볼까요? 9를
이진수로 풀면
'00001001'입니다.
이것을 1과
AND연산을 하면
'00000001'입니다.
1이라는 얘기입니다. 따라서
TRUE가 됩니다.
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
AND |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
= |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
[참고]
다음은 10진수를
2진수로 바꾸는 프로시져입니다. 이번
뉴스레터를 위해 사용하였습니다. 사용시 주의할 점은
숫자를 다루는 프로시져이지만 매개변수와 돌려주는 값이 모두 String형입니다.
Function
DecToBin(DecNum As String) As String
Dim BinNum As String
Dim lDecNum As Long
Dim i As Integer
On
Error GoTo ErrorHandler
For i =
1 To Len(DecNum)
If Asc(Mid(DecNum, i, 1)) < 48 Or _
Asc(Mid(DecNum, i, 1)) > 57 Then
BinNum = ""
Err.Raise 1010, "DecToBin", "잘못된
입력입니다"
End If
Next i
i = 0
lDecNum = Val(DecNum)
Do
If lDecNum And 2 ^ i Then
BinNum = "1" & BinNum
Else
BinNum = "0" & BinNum
End If
i = i + 1
Loop Until 2 ^ i > lDecNum
DecToBin = BinNum
ErrorHandler:
End Function |
|