He visto a otros usar Bitwise-OR para combinar banderas antes:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN | JUMP | SHOOT;
Esa es también la forma en que lo hago.
Pero también he visto algunos (no tantos) combinan banderas usando la suma:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN + JUMP + SHOOT;
¿Cuál es más "legible"? (¿Cuál crees que reconocerán más personas?) ¿Cuál es la forma "estándar" de hacerlo? ¿Cuál prefieres?
1<<0
,1<<1
,1<<2
, y así sucesivamente. Cuando tiene muchas banderas, se vuelve más legible, más fácil de mantener y menos propenso a errores. Por ejemplo, si está empacando todos los 64 bits de un int 64 bits, realmente desea evitar errores tipográficos :) La forma en que representa1
también es importante. Para un entero de 64 bits en VS2010, creo que es1UI64
, o algo así. Usar un tipo incorrecto puede morderte.Respuestas:
Bitwise-OR.
La adición es peligrosa.
Considere un ejemplo donde un bandido es una persona, y un bandido enojado es un bandido que habla y dispara. Más tarde, decides que todos los bandidos deberían disparar, pero te has olvidado de la definición de bandido enojado y no eliminas su bandera de disparos.
Si usaras
angryBandit_add
tu juego ahora tendría el error lógico desconcertante de tener bandidos enojados que no pueden disparar o ser asesinados.Si
angryBandit_or
usaras lo peor que tendrías es redundante| SHOOTS
.Por razones similares, NO a nivel de bits es más seguro que la resta para eliminar banderas.
fuente
bitwise-OR transmite la intención más claramente
también, bitwise-OR debería ser más eficiente
fuente