J'ai déjà vu d'autres utiliser Bitwise-OR pour combiner des indicateurs avant:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN | JUMP | SHOOT;
C'est aussi ainsi que je le fais.
Mais j'ai également vu certains (moins nombreux) combiner des indicateurs en utilisant l'addition:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN + JUMP + SHOOT;
Lequel est le plus "lisible"? (Laquelle pensez-vous que plus de gens reconnaîtront?) Quelle est la façon "standard" de le faire? lequel préfères-tu?
1<<0
,1<<1
,1<<2
et ainsi de suite. Lorsque vous avez de nombreux indicateurs, il devient plus lisible, plus facile à entretenir, moins sujet aux erreurs. Par exemple, si vous emballez tous les 64 bits d'un entier 64 bits, vous voulez vraiment éviter les fautes de frappe :) La façon dont vous représentez1
est également importante. Pour un entier 64 bits dans VS2010, je pense que c'est le cas1UI64
, ou quelque chose comme ça. Utiliser un mauvais type pourrait vous mordre.Réponses:
Bitwise-OR.
L'ajout est dangereux.
Prenons un exemple où un bandit est une personne et un bandit en colère est un bandit qui parle et tire. Plus tard, vous décidez que tous les bandits doivent tirer, mais vous avez oublié la définition du bandit en colère et ne supprimez pas son drapeau de tir.
Si vous utilisiez
angryBandit_add
votre jeu, vous auriez maintenant l'erreur logique perplexe d'avoir des bandits en colère qui ne peuvent pas tirer ou être tués.Si vous avez utilisé
angryBandit_or
le pire que vous auriez, c'est une redondance| SHOOTS
.Pour des raisons similaires, NOT au niveau du bit est plus sûr que la soustraction pour supprimer les drapeaux.
la source
bit-OR exprime plus clairement l'intention
également, OR au niveau du bit devrait être plus efficace
la source