XOR Objective-c

22
有没有一种方法可以设置条件,仅在两个组件中的一个返回true时才返回true?
BOOL var1
BOOL var2

if((var1 && !var2) || (!var1 && var2))更短的某些东西

谢谢


8
如果(var1 ^ var2)为真,你可以使用这个。 - Siddiqui
6个回答

55

由于Objective-C是C的超集,因此您可以直接使用C中的异或运算符,即^


25
这是按位异或运算,如果你需要逻辑异或,只需使用!= - Gabriele Petronella
2
没有一种解决方案能始终有效。BOOL 可以是任何整数。如果两个值都是非零但不相等,那么两者都会失败。最健壮的选择可能是像原始问题一样将其完全写出。 - Drew McCormack
2
@DrewMcCormack,为了避免这个问题,您可以使用两个感叹号将任何类型转换为真正的BOOL!!var1!= !!var2 - DanSkeel

44

XOR

if(!!var1 != !!var2)
{
   NSLog(@"XOR condition");
}

感叹号将变量转换为BOOL类型(真实转换,而不是强制类型转换)。
因此,即使您的变量不是BOOL类型,这种解决方案也可以正常工作。

!!(0|nil) ≡ 0  
!!(any other number|object) ≡ 1

在某些情况下,当你想要确保仅有一个变量非空时,这将会很有用。


短小,优雅,易懂,简单。 - meronix
默认情况下,BOOL变量为NO。在这种情况下,我认为它是失败的。请检查一下。 - Prasad G
@Prasad G,布尔变量默认为“否”。这会产生什么影响?异或条件TRUE,TRUE和False,false两个条件都会得到False和True,False和False,TRUE的结果是True。那么上述条件中的问题在哪里? - Ishu
@prasadG,BOOL a,b;如果(a!=b) { NSLog(@"XOR"); } //即使使用默认值,这段代码也不会给我错误的答案 - Ishu
@Ishu:我也有同样的问题。我不知道发生了什么事情。 - Prasad G
显示剩余3条评论

3
你可以通过以下方式将Ishu建议的代码更加清晰易懂:

#define XOR !=

然后你只需写下以下代码:
if (var1 XOR var2) {

    ...
}

真值表输出:
[T 异或 T => F; T 不等于 T => F],
[T 异或 F => T; T 不等于 F => T],
[F 异或 T => T; F 不等于 T => T] 和
[F 异或 F => F; F 不等于 F => F]


@AlbertRenshaw 是的,因为它会得出相同的真值表:[T XOR T => F; T != T => F],[T XOR F => T; T != F => T],[F XOR T => T; F != T => T] 和 [F XOR F => F; F != F => F]。 - Lukas Kalinski
1
哇,你说得对。我现在感觉很愚蠢,竟然没有意识到这一点!谢谢你教给我。 - Albert Renshaw

2

宏定义可能是一个选项。在更易读的方式下,它将保持相同的行为。

#define XOR(x,y) (((x) && !(y)) || (!(x) && (y)))

if(XOR(var1, var2) {

}

0
if ((!var1)==var2) 
{
        NSLog(@"Yes");
}

0

尝试 (int)var1 ^ (int)var2 实际上以下面方式定义的 YES 和 NO:

#define YES (BOOL)1
#define NO  (BOOL)0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接