5

我只是想知道 C 中是否有 XOR 逻辑运算符(类似于 && 用于 AND 但用于 XOR)。我知道我可以将 XOR 拆分为 AND、NOT 和 OR,但简单的 XOR 会好得多。然后我想到,如果我在两个条件之间使用普通的 XOR 位运算符,它可能会起作用。对于我的测试,它确实如此。

考虑:

int i = 3;
int j = 7;
int k = 8;

只是为了这个相当愚蠢的例子,如果我需要k大于i或大于j但不是两者,XOR 将非常方便。

if ((k > i) XOR (k > j))
   printf("Valid");
else
   printf("Invalid");

或者

printf("%s",((k > i) XOR (k > j)) ? "Valid" : "Invalid");

我把按位 XOR ^并产生“无效”。将两次比较的结果放在两个整数中导致这两个整数包含 1,因此 XOR 产生了错误。然后我用 & 和 | 进行了尝试 位运算符,两者都给出了预期的结果。知道真实条件具有非零值,而虚假条件具有零值,所有这些都是有道理的。

我想知道,是否有理由使用逻辑 && 和 || 当位运算符 &, | 和 ^ 工作一样吗?

4

5 回答 5

13

您不需要逻辑异或,我忘记了SO问题,但是它与您的想法相似,基本上我们不需要异或,它相当于!=无论如何

FALSE XOR FALSE == FALSE
FALSE XOR TRUE == TRUE
TRUE XOR FALSE == TRUE
TRUE XOR TRUE == FALSE


FALSE != FALSE == FALSE
FALSE != TRUE == TRUE
TRUE != FALSE == TRUE
TRUE != TRUE == FALSE

我将搜索我的收藏夹,稍后将链接粘贴到此处...

于 2010-05-05T12:47:01.607 回答
11

位运算符的工作方式与 && 和 || 不同。操作员。首先,&& 和 || 执行短路评估,而按位运算符不执行。换句话说,你不能用位运算符做这样的事情:

int * p = 0;
(p != 0) && (*p = 1);

因为如果你说:

(p != 0) & (*p = 1);

两个子表达式都将被评估,并且您将取消引用空指针。

于 2010-05-05T12:41:29.397 回答
1

当操作数是整数值时,按位 XOR 不像逻辑 XOR 那样工作:

2^4 ? "Valid" : "Invalid"

给出“有效”,但应该给出“无效”

于 2010-05-05T12:47:28.743 回答
1

在 C 语言中,逻辑运算符的参数被视为布尔值——任何零都被视为“假”,其他任何东西(是的,负值也是)都是“真”。位运算作用于单个位,正如 Neil 已经指出的那样,它不像逻辑运算那样受到短路评估。

在您的示例中,结果是完全有效和预期的,因为xor两个 1 之间的按位为零。

于 2010-05-05T12:50:04.603 回答
1

如果你想要 C 中的逻辑异或运算符,那么你可以使用这个:

#define xor != 0 ^ !!

它通过将表达式的两边都转换为布尔值并对它们进行异或运算来工作。您可以像使用 && 或 || 一样使用它,如下所示:

if (a xor b)

AFAICT,没有任何问题。

于 2010-05-30T12:14:02.983 回答