Ich habe schon andere gesehen, die Bitwise-OR verwenden, um Flags zu kombinieren:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN | JUMP | SHOOT;
So mache ich es auch.
Aber ich habe auch einige (nicht so viele) kombinierte Flags mit Addition gesehen:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN + JUMP + SHOOT;
Welches ist "lesbarer"? (Welche werden Ihrer Meinung nach mehr Menschen erkennen?) Was ist die "Standard" -Methode, um dies zu tun? Welches bevorzugen Sie?
1<<0
,1<<1
,1<<2
, und so weiter. Wenn Sie viele Flags haben, wird es besser lesbar, leichter zu warten und weniger fehleranfällig. Wenn Sie beispielsweise alle 64-Bit-Werte eines 64-Bit-Inters packen, möchten Sie Tippfehler unbedingt vermeiden :) Auch Ihre Darstellung1
ist wichtig. Für eine 64-Bit-Ganzzahl in VS2010 denke ich, ist es1UI64
oder so ähnlich. Die Verwendung eines falschen Typs könnte Sie beißen.Antworten:
Bitweises ODER.
Der Zusatz ist gefährlich.
Stellen Sie sich ein Beispiel vor, bei dem ein Bandit eine Person ist und ein wütender Bandit ein Bandit, der spricht und schießt. Später entscheiden Sie, dass alle Banditen schießen sollen, aber Sie haben die Definition der wütenden Banditen vergessen und entfernen die Schießfahne nicht.
Wenn du
angryBandit_add
dein Spiel benutzt hättest du jetzt den verwirrenden logischen Fehler, wütende Banditen zu haben, die nicht schießen oder getötet werden können.Wenn Sie
angryBandit_or
das Schlimmste verwendet hätten, wäre es eine Redundanz| SHOOTS
.Aus ähnlichen Gründen ist bitweises NICHT sicherer als Subtraktion zum Entfernen von Flags.
quelle
Bitweises ODER vermittelt die Absicht klarer
Bitweises ODER sollte effizienter sein
quelle