Operator logika ( ||
dan &&
) vs. operator bitwise ( |
dan &
).
Perbedaan paling penting antara operator logika dan operator bitwise adalah bahwa operator logika mengambil dua boolean dan menghasilkan boolean sementara operator bitwise mengambil dua bilangan bulat dan menghasilkan bilangan bulat (catatan: bilangan bulat berarti tipe data integral apa pun, bukan hanya int).
Untuk menjadi bertele-tele, operator bitwise mengambil pola bit (mis. 01101011) dan melakukan sedikit DAN / ATAU pada setiap bit. Jadi, misalnya jika Anda memiliki dua bilangan bulat 8-bit:
a = 00110010 (in decimal: 32+16+2 = 50)
b = 01010011 (in decimal: 64+ 16+2+1 = 83)
----------------
a & b = 00010010 (in decimal: 16+2 = 18)
a | b = 01110011 (in decimal: 64+32+16+2+1 = 115)
sedangkan operator logika hanya bekerja di bool
:
a = true
b = false
--------------
a && b = false
a || b = true
Kedua, sering kali mungkin untuk menggunakan operator bitwise pada bool karena true dan false masing-masing setara dengan 1 dan 0, dan jika Anda menerjemahkan true ke 1 dan false ke 0, lalu lakukan operasi bitwise, lalu ubah bukan nol menjadi benar dan nol menjadi salah; Kebetulan hasilnya akan sama jika Anda baru saja menggunakan operator logika (periksa ini untuk latihan).
Perbedaan penting lainnya adalah bahwa operator logika dihubung pendek . Karenanya, di beberapa lingkaran [1], Anda sering melihat orang melakukan hal seperti ini:
if (person && person.punch()) {
person.doVictoryDance()
}
yang diterjemahkan menjadi: "jika orang itu ada (yaitu bukan nol), cobalah untuk meninju dia, dan jika pukulan itu berhasil (yaitu kembali benar), maka lakukan tarian kemenangan" .
Jika Anda menggunakan operator bitwise, ini:
if (person & person.punch()) {
person.doVictoryDance()
}
akan diterjemahkan menjadi: "jika orang itu ada (yaitu bukan nol) dan pukulan berhasil (yaitu mengembalikan nilai true), maka lakukan tarian kemenangan" .
Perhatikan bahwa di operator logika hubung pendek, person.punch()
kode tidak dapat dijalankan sama sekali jika person
null. Faktanya, dalam kasus khusus ini, kode kedua akan menghasilkan kesalahan referensi nol jika person
nol, karena mencoba memanggil person.punch()
tidak peduli apakah orang itu nol atau tidak. Perilaku tidak mengevaluasi operan kanan ini disebut hubung singkat .
[1] Beberapa pemrogram akan menolak untuk menempatkan pemanggilan fungsi yang memiliki efek samping di dalam if
ekspresi, sementara untuk pemrogram lain itu adalah ungkapan yang umum dan sangat berguna.
Karena operator bitwise bekerja pada 32-bit dalam satu waktu (jika Anda menggunakan mesin 32-bit), ini dapat menghasilkan kode yang lebih elegan dan lebih cepat jika Anda perlu membandingkan sejumlah besar kondisi, mis.
int CAN_PUNCH = 1 << 0, CAN_KICK = 1 << 1, CAN_DRINK = 1 << 2, CAN_SIT = 1 << 3,
CAN_SHOOT_GUNS = 1 << 4, CAN_TALK = 1 << 5, CAN_SHOOT_CANNONS = 1 << 6;
Person person;
person.abilities = CAN_PUNCH | CAN_KICK | CAN_DRINK | CAN_SIT | CAN_SHOOT_GUNS;
Place bar;
bar.rules = CAN_DRINK | CAN_SIT | CAN_TALK;
Place military;
military.rules = CAN_SHOOT_CANNONS | CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT;
CurrentLocation cloc1, cloc2;
cloc1.usable_abilities = person_abilities & bar_rules;
cloc2.usable_abilities = person_abilities & military_rules;
Melakukan hal yang sama dengan operator logika akan membutuhkan banyak perbandingan:
Person person;
person.can_punch = person.can_kick = person.can_drink = person.can_sit = person.can_shoot_guns = true;
person.can_shoot_cannons = false;
Place bar;
bar.rules.can_drink = bar.rules.can_sit = bar.rules.can_talk = true;
bar.rules.can_punch = bar.rules.can_kick = bar.rules.can_shoot_guns = bar.rules.can_shoot_cannons = false;
Place military;
military.rules.can_punch = military.rules.can_kick = military.rules.can_shoot_guns = military.rules.can_shoot_cannons = military.rules.can_sit = true;
military.rules.can_drink = military.rules.can_talk = false;
CurrentLocation cloc1;
bool cloc1.usable_abilities.can_punch = bar.rules.can_punch && person.can_punch,
cloc1.usable_abilities.can_kick = bar.rules.can_kick && person.can_kick,
cloc1.usable_abilities.can_drink = bar.rules.can_drink && person.can_drink,
cloc1.usable_abilities.can_sit = bar.rules.can_sit && person.can_sit,
cloc1.usable_abilities.can_shoot_guns = bar.rules.can_shoot_guns && person.can_shoot_guns,
cloc1.usable_abilities.can_shoot_cannons = bar.rules.can_shoot_cannons && person.can_shoot_cannons
cloc1.usable_abilities.can_talk = bar.rules.can_talk && person.can_talk;
bool cloc2.usable_abilities.can_punch = military.rules.can_punch && person.can_punch,
cloc2.usable_abilities.can_kick = military.rules.can_kick && person.can_kick,
cloc2.usable_abilities.can_drink = military.rules.can_drink && person.can_drink,
cloc2.usable_abilities.can_sit = military.rules.can_sit && person.can_sit,
cloc2.usable_abilities.can_shoot_guns = military.rules.can_shoot_guns && person.can_shoot_guns,
cloc2.usable_abilities.can_talk = military.rules.can_talk && person.can_talk,
cloc2.usable_abilities.can_shoot_cannons = military.rules.can_shoot_cannons && person.can_shoot_cannons;
Contoh klasik di mana pola bit dan operator bitwise digunakan dalam izin sistem file Unix / Linux.