opérateur logique (||,&&) vs opérateur au niveau du bit (|,&)
La différence la plus fondamentale entre la logique de l'opérateur et bit-à-bit opérateur que l'opérateur logique prend deux booléens et produit un booléen tout opérateur au niveau du bit prend deux entiers et produit un nombre entier (note: les nombres entiers s'entend de toute partie intégrante de type de données, et pas seulement de type int).
Pour être pédant, au niveau du bit opérateur prend un peu d'un motif (p. ex. 01101011) et fait un peu sage ET/OU sur chaque morceaux. Ainsi, par exemple, si vous avez deux 8-bits entiers:
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)
tandis qu'un opérateur logique ne fonctionne que dans bool
:
a = true
b = false
--------------
a && b = false
a || b = true
Deuxièmement, il est souvent possible d'utiliser l'opérateur au niveau du bit sur bool depuis le vrai et le faux est équivalent à 1 et 0 respectivement, et il arrive que si vous traduisez vrai 1 et false à 0, puis effectuez l'opération au niveau du bit, puis convertir les non-zéro et zéro à faux; il arrive que le résultat sera le même si vous venez d'utiliser opérateur logique (à vérifier pour l'exercice).
Une autre distinction importante est également que l'opérateur logique est court-circuitée. Ainsi, dans certains milieux, [1], vous voyez souvent les gens de faire quelque chose comme ceci:
if (person && person.punch()) {
person.doVictoryDance()
}
ce qui se traduit par: if person exists (i.e. is not null), try to punch him, and if the punch succeeds (i.e. returns true), then do a victory dance
aviez-vous utilisé un opérateur au niveau du bit au lieu de cela, ceci:
if (person & person.punch()) {
person.doVictoryDance()
}
traduire: if person exists (i.e. is not null) and the punch succeeds (i.e. returns true), then do a victory dance
.
Notez que dans le court-circuitée opérateur logique, l' person.punch()
code ne peuvent ne pas fonctionner du tout si la personne est nulle. En fait, dans ce cas particulier, le deuxième code, serait de produire une référence null erreur si la personne est nulle, puisqu'il tente de l'appeler personne.punch (), peu importe si la personne est null ou pas. Ce problème de ne pas évaluer l'opérande de droite est appelé de court-circuit.
[1] certains programmeurs vont baulk pour mettre un appel de fonction qui ont un effet secondaire à l'intérieur d'une expression, tandis que pour d'autres, c'est une commune très utile idiome.
Depuis l'opérateur au niveau du bit fonctionne sur 32-bits à la fois (si vous êtes sur une machine 32 bits), elle peut conduire à une plus élégante et la plus rapide de code si vous avez besoin de comparer un grand nombre de conditions, par exemple
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`
faire de même avec les opérateurs logiques aurait besoin d'un maladroit nombre de comparaisons:
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;
Un exemple classique où le bit-modèles et opérateur au niveau du bit sont utilisés dans les environnements Unix/Linux autorisation du système de fichiers.