다음을 통해 공유


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, Or, 및 Xor 연산자를 보여 줍니다.

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.

Short-Circuiting 논리 작업

AndAlso 연산자는 두 And 식에 대해 논리적 합을 수행한다는 점에서 Boolean 연산자와 매우 유사합니다. 둘 사이의 주요 차이점은 AndAlso쇼트 회로 동작을 나타낸다는 것입니다. 첫 번째 식 AndAlsoFalse로 평가되면, 두 번째 식은 최종 결과를 변경할 수 없기 때문에 계산되지 않고 AndAlsoFalse를 반환합니다.

마찬가지로 OrElse 연산자는Boolean 식에서 단락 논리 분리를 수행합니다. 첫 번째 식 OrElseTrue로 평가되면, 두 번째 식은 최종 결과를 변경할 수 없기 때문에 계산되지 않고 OrElseTrue를 반환합니다.

Short-Circuiting Trade-Offs

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

다음 예제는 AndOr 및 그들의 단락 평가 대응 간의 차이점을 보여줍니다.

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 문은 checkIfValid()12 > 45를 반환하더라도, False는 단락 평가를 수행하지 않기 때문에 And을 호출합니다. 두 번째 If 문은 checkIfValid()를 호출하지 않습니다. 이는 12 > 45False를 반환할 때 AndAlso가 두 번째 식을 단락시키기 때문입니다. 세 번째 If 문은 checkIfValid()이(가) 단락 평가를 하지 않기 때문에, 12 < 45이(가) True을(를) 반환하더라도 Or을(를) 호출합니다. 네 번째 If 문은 checkIfValid()을 호출하지 않습니다. 왜냐하면 12 < 45True을 반환할 때, OrElse가 두 번째 식의 평가를 중단하기 때문입니다.

비트 연산

비트 연산은 이진(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 연산자는 비트 연산을 지원하지 않습니다.

비고

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

참고하십시오