【发布时间】:2019-02-12 22:11:42
【问题描述】:
我在游戏中的玩家命令上使用位标志来决定是否应该允许它们执行。 所以位标志的列表是这样的:
CMD_NONE = 0x0,
CMD_TELEPORT = 0x1,
CMD_VIP = 0x2,
CMD_NO_LOG = 0x4, // don't log the execution of this command
我想做的是制作一些函数/宏来简化事情,因为我想检查命令是否设置了 CMD_TELEPORT 或 CMD_VIP 和 nothing 更多,所以CMD_TELEPORT 和CMD_VIP 都是可选的,可以开/关,但不能同时启用其他任何功能。
至于现在我是手动检查的,但这很麻烦。 我无法使用
if (flags == (CMD_TELEPORT | CMD_VIP)
因为这会检查是否同时设置了 两个 标志,并且我希望它们实际上是唯一可以设置 的标志,但是不一定同时。 所以它是 CMD_NONE、CMD_TELEPORT、CMD_VIP 或 (CMD_TELEPORT | CMD_VIP)
我可以做一些循环并检查每个标志是否已设置并从标志值中减少它并检查是否有任何剩余,但我希望有一种更简单的方法来做到这一点。
【问题讨论】:
-
如果
CMD_NO_LOG不应该使用,有没有意义? -
这只是一个例子,我为不同的目的使用了更多的标志,但是在很多情况下我只想允许带有特定标志的命令,假设玩家正在执行某些任务并且我不想要允许任何传送或 vip 命令等,所以我只检查对游戏本身没有任何影响的
optional标志(所以它可以是 CMD_NONE 或 CMD_NO_LOG 但其他任何东西都被阻止等,还有其他可选标志)
标签: bit-fields bitmask