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

标签 objective-c if-statement enums bit-manipulation

这是我想做的。我有一个简单的 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/

相关文章:

ios - 从静态库中确定目标的构建配置类型

objective-c - SceneKit 中的正交相机和缩放控件

if-statement - DOS 批处理 if 语句的奇怪行为 : expected or bug?

java:S1121: "Extract the assignment out of this expression."

c++ - 我怎样才能干净地验证并转换为非顺序的枚举?

c# - 将 invalidValue 分配给 Enum 变量(为什么这不抛出异常?)

ios - 长按 url 并选择 "open in safari"时 DynamicLink 不起作用

bash - 我怎样才能在 bash 中找到 "try to do something and then detect if it fails"?

c++ - C++中的特殊枚举

ios - NSMutableAttributedString 应用崩溃