gpt4 book ai didi

objective-c - 在 NS_OPTIONS 中测试多个标志或条件

转载 作者:行者123 更新时间:2023-12-05 09:23:10 29 4
gpt4 key购买 nike

这是我想做的。我有一个简单的 NS_OPTIONS 设置,例如

typedef NS_OPTIONS(NSUInteger, BuildingsPresent) {
NoBuildings = 0,
LadderPresent = 1 << 0,
WallPresent = 1 << 1,
RoomPresent = 1 << 2,
RoomUpgradePresent = 1 << 3
};

我设置的值是这样的:

self.buildingPresent |= LadderPresent | WallPresent;

这似乎工作正常,但现在我想像这样一次测试 if 语句中的标志:

if (self.buildingPresent & LadderPresent & WallPresent) {

这不能正常工作。如果我将它分解成多个 if 语句,它似乎确实有效:

if (self.buildingPresent & LadderPresent) {
if (self.buildingPresent & WallPresent) {
//do something
}
}

我也想适本地测试缺少的东西,所以写这个的理想方式是:

if (!(self.buildingPresent & RoomPresent) && (self.buildingPresent & LadderPresent & WallPresent) {

这在 Objective-C 中可行吗?我做错了什么吗?

最佳答案

if (self.buildingPresent & LadderPresent & WallPresent)

这将始终评估为 false。

& 运算符仅在运算符两侧都将位设置为 1 的位位置返回 1,在所有其他位置返回 0。

LadderPresent 和 WallPresent 没有两位都为 1 的位置,因此它们将始终全为 0。并且无论您使用全零的 & 什么都将全为零,因此为假。

如果您打算检查 LadderPresent 位和 WallPresent 位是否都处于事件状态,您需要将它们在一起,然后AND 将结果赋给变量:

if (self.buildingPresent & (LadderPresent | WallPresent)) {

这将为 self.buildingPresent 的任何值返回 true,只要 EITHER LadderPresentWallPresent位设置为 1。

为了验证BOTH 是否设置为 1,我们必须将我们的变量AND 为表示两者都设置为 1 的掩码,然后查看该掩码是否等于我们想要的面具:

NSInteger bitMask = (LadderPresent | WallPresent)
if ((self.buildingPresent & bitMask) == bitMask) {

此示例现在仅当 BOTH 都设置为 1 时才返回 true。


测试缺少位的正确方法看起来更像这样:

(self.buildingPresent & RoomPresent) == 0

self.buildingPresent 在该位置有 0 时返回 true,当它有 1 时返回 false。

关于objective-c - 在 NS_OPTIONS 中测试多个标志或条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24026071/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com