Já vi outras pessoas usando o Bitwise-OR para combinar sinalizadores antes:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN | JUMP | SHOOT;
Também é assim que eu faço.
Mas também vi alguns (não tantos) combinar bandeiras usando a adição:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN + JUMP + SHOOT;
Qual é mais "legível"? (Qual você acha que mais pessoas reconhecerão?) Qual é a maneira "padrão" de fazer isso? Qual você prefere?
1<<0
,1<<1
,1<<2
e assim por diante. Quando você tem muitos sinalizadores, ele se torna mais legível, mais sustentável e menos propenso a erros. Por exemplo, se você estiver compactando todos os 64 bits de um int de 64 bits, você realmente deseja evitar erros de digitação :) Como você representa1
também é importante. Para um número inteiro de 64 bits no VS2010, acho que é1UI64
, ou algo assim. Usar um tipo errado pode morder você.Respostas:
OR bit a bit.
A adição é perigosa.
Considere um exemplo em que um bandido é uma pessoa e um bandido zangado é um bandido que fala e atira. Mais tarde, você decide que todos os bandidos devem atirar, mas esqueceu a definição de bandido irritado e não remove sua bandeira de tiro.
Se você usou
angryBandit_add
o jogo, agora teria o erro lógico desconcertante de ter bandidos raivosos que não podem atirar ou ser mortos.Se você usasse
angryBandit_or
o pior, teria um redundante| SHOOTS
.Por razões semelhantes, NOT bit a bit é mais seguro que a subtração para remover sinalizadores.
fonte
OR bit a bit transmite a intenção mais claramente
Além disso, OR bit a bit deve ser mais eficiente
fonte