位标志-检查是否设置了任何特定标志(且没有其他标志)

时间:2019-02-12 22:11:42

标签: bit-fields bitmask

我在游戏中的玩家命令上使用位标记来决定是否应允许它们执行。 因此,位标志列表如下所示:

CMD_NONE = 0x0,
CMD_TELEPORT = 0x1,
CMD_VIP = 0x2,
CMD_NO_LOG = 0x4, // don't log the execution of this command

我想做的是做一些功能/宏来简化事情,因为我想检查一下命令是否设置了CMD_TELEPORTCMD_VIP并且没有设置 strong>更多,因此CMD_TELEPORTCMD_VIP都是可选的,并且可以打开/关闭,但不能同时启用其他任何功能。

就目前而言,我正在手动检查此问题,但是这很麻烦。 我不能使用

if (flags == (CMD_TELEPORT | CMD_VIP)

因为这会检查是否同时设置了两个标志,所以我希望它们实际上是唯一可以设置的标志,但是不必在同一时间。 所以它是CMD_NONE,CMD_TELEPORT,CMD_VIP或(CMD_TELEPORT | CMD_VIP)

我可以做一些循环,检查每个标志是否已设置,并将其从标志值中递减,并检查是否还有剩余,但我希望有一种更简单的方法。

1 个答案:

答案 0 :(得分:0)

如果要检查是否未设置CMD_TELEPORTCMD_VIP以外的其他位,则可以将它们屏蔽掉,看看结果是否为非零:

if (flags & ~(CMD_TELEPORT|CMD_VIP)) {
    /* something else is set */
} else {
    /* just TELEPORT or VIP, or both, or nothing */
}

如果您要进一步检查其中只有一个,则必须单独检查。有了两个标志,这很容易,但其中的更多标志会有点重复。