Поделиться через


Логические и побитовые операторы в Visual Basic

Обновлен: Ноябрь 2007

Логические операторы сравнивают Boolean выражения и возвращают Boolean результат. Операторы And, Or, AndAlso, OrElse и Xor являются бинарными , так как они принимают два операнда, а оператор Not является унарным, поскольку он принимает один операнд. Некоторые из этих операторов могут также выполнять побитовые логические операции над целыми значениями.

Унарный логический оператор

Оператор Not (Visual Basic) выполняет логическое отрицание выражения Boolean. Он возвращает логическую противоположность своего операнда. Если выражение True, то Not возвращает False; если выражение False, то Not возвращает True. Это показано в приведенном ниже примере.

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 (Visual Basic) выполняет логическое умножение двух Boolean выражений. Если оба выражения True, то And возвращает True. Если хотя бы одно из выражений False, то And возвращает False.

Оператор Or (Visual Basic) выполняет логическое сложение или импликацию двух Boolean выражений. Если выражение True или оба выражения True, то Or возвращает True. Если ни одно выражение не True, то Or возвращает False.

Оператор Xor (Visual Basic) выполняет логическое исключение двух Boolean выражений. Если точно одно выражение True, но не оба, то Xor возвращает True. Если оба выражения True или оба False, то Xor возвращает False.

В следующем примере показано использование операторов 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.

Логические операторы сокращенного вычисления

Оператор AndAlso похож на оператор And в том, что он также выполняет логическое умножение двух Boolean выражений. Ключевое различие между ними состоит в том, что AndAlso выполняет сокращенную обработку. Если первое выражение AndAlso равно False, то второе выражение не вычисляется, поскольку оно не повлияет на конечный результат, и AndAlso возвращает False.

Подобным образом Оператор OrElse выполняет сокращенное логическое сложение для двух Boolean выражений. Если первое выражение OrElse равно True, то второе выражение не вычисляется, поскольку оно не повлияет на конечный результат, и OrElse возвращает True.

Соглашения сокращенных вычислений

Сокращенные вычисления могут повысить производительность за счет не вычисления выражений, которые не влияют на результаты логической операции. Однако, если выражение выполняет дополнительные действия, то сокращенные вычисления пропускают эти действия. Например, если выражение содержит вызов процедуры 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 вызывает checkIfValid(), хотя 12 > 45 принимает значение False, так как используется не сокращенный оператор And. Вторая инструкция If не вызывает checkIfValid(), так как 12 > 45 принимает значение False, и AndAlso игнорирует второе выражение. Третья инструкция If вызывает checkIfValid(), хотя 12 < 45 принимает значение True, так как используется не сокращенный оператор Or. Четвертая инструкция If не вызывает checkIfValid(), так как 12 < 45 возвращает значение True, и OrElse игнорирует второе выражение.

Поразрядные операции

При поразрядных операциях используются два целых значения в двоичной форме (по основанию 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 (Результат в двоичной форме)

  • Результат рассматривается как десятичное число. Значение 001 является двоичным представлением 1, поэтому x = 1.

Подобным образом выполняется поразрядная операция Or, за исключением того, что 1 присваивается результирующему разряду, если любой из вычисленных разрядов равен 1. Xor назначает 1 результирующему разряду, если только один из сравниваемых разрядов (но не оба) равен 1. Not выбирает один операнд и инвертирует все разряды, включая знаковый разряд, и назначает это значение результату. Это означает, что для положительных чисел со знаком Not всегда возвращает отрицательное значение, а для отрицательных чисел Not всегда возвращает положительное или нулевое значение.

Операторы AndAlso и OrElse не поддерживают побитовые операции.

wz3k228a.alert_note(ru-ru,VS.90).gifПримечание.

Поразрядные операции выполняются только над целыми типами. Значения с плавающей запятой необходимо преобразовать в целые типы перед переходом к поразрядной операции.

См. также

Основные понятия

Логические выражения

Арифметические операторы в Visual Basic

Операторы сравнения в Visual Basic

Операторы объединения в Visual Basic

Эффективное сочетание операторов

Ссылки

Логические (побитовые) операторы