我在游戏中的玩家命令上使用位标记来决定是否应允许它们执行。 因此,位标志列表如下所示:
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
并且没有设置 strong>更多,因此CMD_TELEPORT
和CMD_VIP
都是可选的,并且可以打开/关闭,但不能同时启用其他任何功能。
就目前而言,我正在手动检查此问题,但是这很麻烦。 我不能使用
if (flags == (CMD_TELEPORT | CMD_VIP)
因为这会检查是否同时设置了两个标志,所以我希望它们实际上是唯一可以设置的标志,但是不必在同一时间。 所以它是CMD_NONE,CMD_TELEPORT,CMD_VIP或(CMD_TELEPORT | CMD_VIP)
我可以做一些循环,检查每个标志是否已设置,并将其从标志值中递减,并检查是否还有剩余,但我希望有一种更简单的方法。
答案 0 :(得分:0)
如果要检查是否未设置CMD_TELEPORT
或CMD_VIP
以外的其他位,则可以将它们屏蔽掉,看看结果是否为非零:
if (flags & ~(CMD_TELEPORT|CMD_VIP)) {
/* something else is set */
} else {
/* just TELEPORT or VIP, or both, or nothing */
}
如果您要进一步检查其中只有一个,则必须单独检查。有了两个标志,这很容易,但其中的更多标志会有点重复。