【问题标题】:XOR Objective-c异或目标-c
【发布时间】:2012-07-11 00:33:32
【问题描述】:

有没有办法设置一个仅当两个组件之一返回 true 时才返回 true 的条件?

BOOL var1
BOOL var2

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

谢谢

【问题讨论】:

  • 你可以使用这个 if(var1 ^ var2)

标签: iphone objective-c logic


【解决方案1】:

由于 Objective-C 是 C 的超集,您只需使用 C 中的 XOR 运算符,即^

【讨论】:

  • 这是按位异或,如果你想要逻辑异或,只需使用!=
  • 这两种解决方案都不会一直有效。 BOOL 可以是任何整数。如果两个值都不为零但不相等,则两者都将失败。最可靠的选择可能是完整地写出来,就像原来的问题一样。
  • @DrewMcCormack,为避免此问题,您可以使用两个感叹号将任何类型转换为真正的BOOL!!var1 != !!var2
【解决方案2】:

异或

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

感叹号将 var 转换为 BOOL(真正的转换,而不是强制转换)
因此,即使您的变量不是 BOOL,此解决方案也有效。

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

这在您想确保只有一个 vars 是非空的情况下很有用。

【讨论】:

  • 简短、优雅、轻松、简单
  • 默认 BOOL 变量为 NO。在这种情况下,我认为它是失败的。检查一下
  • 我喜欢这个顺便说一句,但胡萝卜可能更具学术性,感谢您的回答
  • @Prasad G,默认情况下 bool 变量是 No. 有什么影响。 xor 条件 TRUE,TRUE 和 False,false 两个条件都给出 False 和 True,False 和 False,TRUE 给出 True 结果。那么上述情况的问题在哪里。
  • @Ishu:是的。你是对的,但是当 bool 变量是默认值时,它会显示 XOR 条件。每当我们将 NO 分配给变量时,都没有问题
【解决方案3】:

您可以通过这样做为 Ishu 建议的代码添加更多清晰

#define XOR !=

然后你就写:

if (var1 XOR var2) {

    ...
}

真值表输出:
[T XOR T => F; T != T => F],
[T XOR F => T; T != F => T],
[异或 T => T; F != T => T] 和
[F XOR 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]。
  • 哇,你是对的。没有意识到这一点,我真的觉得很愚蠢!谢谢你教我
【解决方案4】:

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

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

if(XOR(var1, var2) {

}

【讨论】:

    【解决方案5】:

    试试(int)var1 ^ (int)var2 YES 和 NO 实际上定义如下:

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

    【讨论】:

      【解决方案6】:
      if ((!var1)==var2) 
      {
              NSLog(@"Yes");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多