Visual Basic의 논리 및 비트 연산자

논리 연산자는 Boolean 식을 비교하고 Boolean 결과를 반환합니다. And, Or, AndAlso, OrElseXor 연산자는 두 개의 피연산자를 사용하므로 이진인 반면 Not 연산자는 단일 피연산자를 사용하므로 단항입니다. 이러한 연산자 중 일부는 정수 값에 대해 비트 논리 연산을 수행할 수도 있습니다.

단항 논리 연산자

Not 연산자Boolean식에서 논리적 부정을 수행합니다. 피연산자의 논리적 반대를 생성합니다. 식이 True로 평가되면 NotFalse를 반환합니다. 식이 False로 평가되면 NotTrue를 반환합니다. 다음 예제에서는 이것을 보여 줍니다.

Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.

이진 논리 연산자

And 연산자는 두 Boolean 식에 대해 논리적 결합을 수행합니다. 두 식이 모두 True로 평가되면 AndTrue를 반환합니다. 식 중 하나 이상이 False로 평가되면 AndFalse를 반환합니다.

Or 연산자Boolean 식에 대해 논리적 분리 또는 포함을 수행합니다. 식이 True로 평가되거나 둘 다 True로 평가되면 OrTrue를 반환합니다. 두 식이 모두 True로 평가되지 않으면 OrFalse를 반환합니다.

Xor 연산자는 두 Boolean 식에 대해 논리적 제외를 수행합니다. 정확히 하나의 식이 True로 평가되지만 둘 다는 아니라면 XorTrue를 반환합니다. 두 식이 모두 True로 평가되거나 둘 다 False로 평가되면 XorFalse를 반환합니다.

다음 예제에서는 And, OrXor 연산자를 보여 줍니다.

Dim a, b, c, d, e, f, g As Boolean

a = 23 > 14 And 11 > 8
b = 14 > 23 And 11 > 8
' The preceding statements set a to True and b to False.

c = 23 > 14 Or 8 > 11
d = 23 > 67 Or 8 > 11
' The preceding statements set c to True and d to False.

e = 23 > 67 Xor 11 > 8
f = 23 > 14 Xor 11 > 8
g = 14 > 23 Xor 8 > 11
' The preceding statements set e to True, f to False, and g to False.

단락 논리 연산

AndAlso 연산자도 두 Boolean 식에서 논리적 결합을 수행한다는 점에서 And 연산자와 매우 유사합니다. 두 가지의 주요 차이점은 AndAlso단락 동작을 보인다는 점입니다. AndAlso 식의 첫 번째 식이 False로 평가되면 두 번째 식은 최종 결과를 변경할 수 없으므로 평가되지 않으며 AndAlsoFalse를 반환합니다.

마찬가지로 OrElse 연산자는 두 Boolean 식에 대해 단락 논리적 분리를 수행합니다. OrElse 식의 첫 번째 식이 True로 평가되면 두 번째 식은 최종 결과를 변경할 수 없으므로 평가되지 않으며 OrElseTrue를 반환합니다.

단락 트레이드오프

단락은 논리 연산의 결과를 변경할 수 없는 식을 평가하지 않음으로써 성능을 향상시킬 수 있습니다. 그러나 해당 식이 추가 작업을 수행하는 경우 단락은 해당 작업을 건너뜁니다. 예를 들어 식에 Function 프로시저 호출이 포함된 경우 식이 단락되고 Function에 포함된 추가 코드가 실행되지 않으면 해당 프로시저가 호출되지 않습니다. 따라서 함수는 가끔만 실행될 수 있으며 올바르게 테스트되지 않을 수 있습니다. 또는 프로그램 논리는 Function의 코드에 따라 달라질 수 있습니다.

다음 예제에서는 And, Or 및 단락 대응 항목 간의 차이점을 보여 줍니다.

Dim amount As Integer = 12
Dim highestAllowed As Integer = 45
Dim grandTotal As Integer
If amount > highestAllowed And checkIfValid(amount) Then
    ' The preceding statement calls checkIfValid().
End If
If amount > highestAllowed AndAlso checkIfValid(amount) Then
    ' The preceding statement does not call checkIfValid().
End If
If amount < highestAllowed Or checkIfValid(amount) Then
    ' The preceding statement calls checkIfValid().
End If
If amount < highestAllowed OrElse checkIfValid(amount) Then
    ' The preceding statement does not call checkIfValid().
End If
Function checkIfValid(ByVal checkValue As Integer) As Boolean
    If checkValue > 15 Then
        MsgBox(CStr(checkValue) & " is not a valid value.")
        ' The MsgBox warning is not displayed if the call to
        ' checkIfValid() is part of a short-circuited expression.
        Return False
    Else
        grandTotal += checkValue
        ' The grandTotal value is not updated if the call to
        ' checkIfValid() is part of a short-circuited expression.
        Return True
    End If
End Function

앞의 예제에서는 호출이 단락될 때 checkIfValid() 내의 몇 가지 중요한 코드가 실행되지 않습니다. 첫 번째 If 문은 And가 단락되지 않으므로 12 > 45에서 False를 반환하더라도 checkIfValid()를 호출합니다. 두 번째 If 문은 12 > 45에서 False를 반환할 때 AndAlso가 두 번째 식을 단락하기 때문에 checkIfValid()를 호출하지 않습니다. 세 번째 If 문은 Or가 단락되지 않으므로 12 < 45에서 True를 반환하더라도 checkIfValid()를 호출합니다. 네 번째 If 문은 12 < 45에서 True를 반환할 때 OrElse가 두 번째 식을 단락하기 때문에 checkIfValid()를 호출하지 않습니다.

비트 연산

비트 연산은 이진(base 2) 형식의 두 정수 값을 평가합니다. 해당 위치에서 비트를 비교한 다음 비교에 따라 값을 할당합니다. 다음 예제에서는 And 연산자를 보여 줍니다.

Dim x As Integer
x = 3 And 5

앞의 예제에서는 x 값을 1로 설정합니다. 이 문제는 다음과 같은 이유로 발생합니다.

  • 값은 이진으로 처리됩니다.

    이진 형식의 3 = 011

    이진 형식의 5 = 101

  • And 연산자는 한 번에 하나의 이진 위치(비트)인 이진 표현을 비교합니다. 지정된 위치에 있는 두 비트가 모두 1이면 결과에서 해당 위치에 1이 배치됩니다. 두 비트 중 하나가 0이면 결과에서 해당 위치에 0이 배치됩니다. 앞의 예제에서는 다음과 같이 작동합니다.

    011(이진 형식의 3)

    101(이진 형식의 5)

    001(이진 형식의 결과)

  • 결과는 10진수로 처리됩니다. 값 001은 1의 이진 표현이므로 x = 1입니다.

비트 Or 연산은 비교된 비트 중 하나 또는 둘 다 1인 경우 결과 비트에 1이 할당된다는 점을 제외하면 비슷합니다. Xor는 비교된 비트 중 하나(둘 다가 아님)가 1이면 결과 비트에 1을 할당합니다. Not은 단일 피연산자를 사용하고 부호 비트를 포함한 모든 비트를 반전하고 해당 값을 결과에 할당합니다. 즉, 부호 있는 양수의 경우 Not은 항상 음수 값을 반환하고 음수의 경우 Not은 항상 양수 또는 0 값을 반환합니다.

AndAlsoOrElse 연산자는 비트 연산을 지원하지 않습니다.

참고 항목

비트 연산은 정수 형식에서만 수행할 수 있습니다. 비트 연산을 진행하려면 부동 소수점 값을 정수 형식으로 변환해야 합니다.

참고 항목