Mantıksal işleç ( ||
ve &&
) ve bitsel işleç ( |
ve &
) karşılaştırması.
Bir mantıksal operatör ile bitsel operatör arasındaki en önemli fark, bir mantıksal operatörün iki boolean alması ve bir boolean üretmesi , bitsel bir operatörün iki tamsayı alması ve bir tamsayı üretmesidir (not: tamsayılar sadece int değil, herhangi bir entegre veri türü anlamına gelir).
Bilgiçlikçi olmak için, bitsel bir operatör bir bit paterni alır (örn. 01101011) ve her bitte biraz bilge bir AND / OR yapar. Örneğin, iki adet 8 bitlik tam sayınız varsa:
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)
mantıksal bir işleç yalnızca şu koşullarda çalışır bool
:
a = true
b = false
--------------
a && b = false
a || b = true
İkincisi, doğru ve yanlış sırasıyla 1 ve 0'a eşdeğer olduğu için bool üzerinde bitsel bir operatör kullanmak genellikle mümkündür ve true değerini 1'e ve false değerini 0'a çevirirseniz, bitsel işlem yaparsanız, sıfırdan farklı bir dönüşüme neden olur. doğru, sıfır doğru yanlış; mantıksal işleç kullanmış olsaydınız sonuç aynı olacaktır (egzersiz için bunu kontrol edin).
Bir diğer önemli ayrım da mantıksal bir operatörün kısa devre yapmasıdır . Böylece, bazı çevrelerde [1], insanların genellikle böyle bir şey yaptığını görürsünüz:
if (person && person.punch()) {
person.doVictoryDance()
}
hangi çevirir: "Kişi (yani boş değil) varsa, ona / onu yumruk çalışın ve delgi (doğru yani getiri) başarılı olursa, o zaman bir zafer dansı yapmak" .
Bunun yerine bitsel bir operatör kullandıysanız, bu:
if (person & person.punch()) {
person.doVictoryDance()
}
çevirecektir: "Kişi varsa (yani boş değil) ve delgi (true yani getiri), sonra bir zafer dansı yapmak başarılı" .
Kısa devreli mantıksal işleçte, person.punch()
boşsa kodun hiç çalıştırılmayabileceğini unutmayın person
. Aslında, bu özel durumda, ikinci kod null olduğunda null referans hatası üretecektir person
, çünkü person.punch()
kişi null olup olmadığına bakılmaksızın çağırmaya çalışır . Doğru işleneni değerlendirmemeye yönelik bu davranışa kısa devre denir .
[1] Bazı programcılar, bir if
ifadenin içinde yan etkisi olan bir işlev çağrısı koymak için baulk yaparken, diğerleri için bu yaygın ve çok yararlı bir deyimdir.
Bitsel bir operatör bir seferde 32 bit üzerinde çalıştığından (32 bit bir makinedeyseniz), çok sayıda koşulu karşılaştırmanız gerekirse daha zarif ve daha hızlı bir koda yol açabilir, örn.
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;
// cloc1.usable_abilities will contain the bit pattern that matches `CAN_DRINK | CAN_SIT`
// while cloc2.usable_abilities will contain the bit pattern that matches `CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT`
Aynı şeyi mantıksal işleçlerle yapmak, çok miktarda karşılaştırma gerektirecektir:
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;
Bit kalıplarının ve bitsel operatörün kullanıldığı klasik bir örnek Unix / Linux dosya sistemi izinleridir.