Bagikan melalui


Operator Logis dan Bitwise di Visual Basic

Operator logis membandingkan Boolean ekspresi dan mengembalikan Boolean hasil. Operator And, Or, AndAlso, OrElse, dan Xor adalah biner karena mereka mengambil dua operand, sedangkan operator Not adalah unari karena membutuhkan satu operand. Beberapa operator ini juga dapat melakukan operasi logis bitwise pada nilai integral.

Operator Logika Unary

Operator Not melakukan negasi logis pada ekspresi Boolean. Ini menghasilkan kebalikan logis dari operandanya. Jika ekspresi mengevaluasi ke True, maka Not mengembalikan False; jika ekspresi mengevaluasi ke False, maka Not mengembalikan True. Contoh berikut mengilustrasikan hal ini.

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

Operator Logika Biner

Operator Dan melakukan konjunsi logis pada dua Boolean ekspresi. Jika kedua ekspresi mengevaluasi ke True, maka And mengembalikan True. Jika setidaknya salah satu ekspresi dievaluasi ke False, maka And mengembalikan False.

Operator OR melakukan disjungsi atau inklusi logis pada dua Boolean ekspresi. Jika salah satu ekspresi mengevaluasi menjadi True, atau kedua-duanya mengevaluasi menjadi True, maka Or mengembalikan True. Jika tidak ada dari kedua ekspresi yang mengevaluasi ke True, maka Or mengembalikan False.

Operator Xor melakukan pengecualian logis pada dua Boolean ekspresi. Jika tepat satu ekspresi dievaluasi menjadi True, tetapi tidak keduanya, maka Xor akan mengembalikan True. Jika kedua ekspresi mengevaluasi ke True atau keduanya mengevaluasi ke False, Xor mengembalikan False.

Contoh berikut mengilustrasikan operator And, Or, dan 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.

Operasi Logis Short-Circuiting

Operator AndAlso sangat mirip dengan operator And, karena juga melakukan konjungsi logis pada dua ekspresi Boolean. Perbedaan utama antara keduanya adalah bahwa AndAlso memiliki perilaku pemutusan cepat. Jika ekspresi pertama dalam AndAlso ekspresi mengevaluasi ke False, maka ekspresi kedua tidak dievaluasi karena tidak dapat mengubah hasil akhir, dan AndAlso mengembalikan False.

Demikian pula, Operator OrElse melakukan disjungsi logis pemutusan cepat pada dua Boolean ekspresi. Jika ekspresi pertama dalam OrElse ekspresi mengevaluasi ke True, maka ekspresi kedua tidak dievaluasi karena tidak dapat mengubah hasil akhir, dan OrElse mengembalikan True.

Short-Circuiting Trade-Offs

Sirkuit pendek dapat meningkatkan performa dengan tidak mengevaluasi ekspresi yang tidak dapat mengubah hasil operasi logis. Namun, jika ekspresi tersebut melakukan tindakan tambahan, sirkuit pendek melewati tindakan tersebut. Misalnya, jika pernyataan menyertakan panggilan ke Function prosedur, maka prosedur tersebut tidak akan dipanggil jika pernyataan diputus singkat, dan kode tambahan apa pun yang terkandung dalam Function tidak berjalan. Oleh karena itu, fungsi mungkin hanya berjalan sesekali, dan mungkin tidak diuji dengan benar. Atau logika program mungkin bergantung pada kode di Function.

Contoh berikut mengilustrasikan perbedaan antara And, Or, dan rekan sirkuit pendek mereka.

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

Dalam contoh sebelumnya, perhatikan bahwa beberapa kode penting di dalam checkIfValid() tidak dijalankan ketika panggilannya dipercepat. Pernyataan pertama If memanggil checkIfValid() meskipun 12 > 45 mengembalikan False, karena And tidak short-circuit. Pernyataan kedua If tidak memanggil checkIfValid(), karena saat 12 > 45 mengembalikan False, AndAlso menghentikan ekspresi kedua lebih awal. Pernyataan ketiga If memanggil checkIfValid() meskipun 12 < 45 mengembalikan True, karena Or tidak melakukan pemutusan awal. Pernyataan keempat If tidak memanggil checkIfValid(), karena ketika 12 < 45 mengembalikan True, OrElse menghentikan ekspresi yang kedua.

Operasi Bitwise

Operasi bitwise mengevaluasi dua nilai integral dalam bentuk biner (dasar 2). Mereka membandingkan bit pada posisi yang sesuai dan kemudian menetapkan nilai berdasarkan perbandingan. Contoh berikut mengilustrasikan And operator.

Dim x As Integer
x = 3 And 5

Contoh sebelumnya menetapkan nilai x menjadi 1. Ini terjadi karena alasan berikut:

  • Nilai diperlakukan sebagai biner:

    3 dalam bentuk biner = 011

    5 dalam bentuk biner = 101

  • Operator And membandingkan representasi biner, satu posisi biner (bit) pada satu waktu. Jika kedua bit pada posisi tertentu adalah 1, maka 1 ditempatkan dalam posisi tersebut dalam hasil. Jika salah satu bit adalah 0, maka 0 ditempatkan dalam posisi tersebut dalam hasil. Dalam contoh sebelumnya, ini berfungsi sebagai berikut:

    011 (3 dalam bentuk biner)

    101 (5 dalam bentuk biner)

    001 (Hasilnya, dalam bentuk biner)

  • Hasilnya diperlakukan sebagai desimal. Nilai 001 adalah representasi biner 1, jadi x = 1.

Operasi bitwise Or serupa, kecuali bahwa 1 ditetapkan pada bit hasil jika salah satu atau kedua-duanya dari bit yang dibandingkan adalah 1. Xor menetapkan 1 ke bit hasil jika tepat salah satu bit yang dibandingkan (bukan keduanya) adalah 1. Not menggunakan satu operan dan menginversi semua bit, termasuk bit tanda, dan menetapkan nilai tersebut sebagai hasil. Ini berarti bahwa untuk angka positif yang ditandatangani, Not selalu mengembalikan nilai negatif, dan untuk angka negatif, Not selalu mengembalikan nilai positif atau nol.

Operator AndAlso dan OrElse tidak mendukung operasi bitwise.

Nota

Operasi bitwise hanya dapat dilakukan pada jenis integral. Nilai floating-point harus dikonversi ke jenis integral sebelum operasi bitwise dapat dilanjutkan.

Lihat juga