배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   홀짝, 간단하게, 풀어보기
제목:   홀짝, 간단하게 풀어보기, 어렵게 풀어보기
     
 

새 페이지 1

  STEP> 따라하기
 

※ 오늘 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