这是我想做的。我有一个简单的 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 LadderPresent
和 WallPresent
位设置为 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/