位标志 - 检查是否设置了任何特定标志(而不是其他标志)

问题描述 投票:0回答:1

我在游戏中的玩家命令上使用位标志来决定是否允许它们执行。所以位标志列表是这样的:

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

而我想做的是制作一些func / macro来简化操作,因为我想检查一下是否让命令设置了CMD_TELEPORTCMD_VIP而且没有更多,所以CMD_TELEPORTCMD_VIP都是可选的,可以打开/关闭,但其他任何东西都无法同时启用。

至于现在我手动检查这个,但这是一个痛苦的屁股。我不能用

if (flags == (CMD_TELEPORT | CMD_VIP)

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

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

bit-fields bitmask
1个回答
0
投票

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

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

如果您想进一步检查其中只有一个是,您必须单独检查。有两个标志,很容易,但有更多的重复。

© www.soinside.com 2019 - 2024. All rights reserved.