在我的脑海中,我无法想到我曾使用过具有逻辑异或运算符的单一语言,但所有语言都具有逻辑和按位and
和or
运算符。
环顾四周,我能找到的唯一原因是独占或不能短路,所以逻辑版本将毫无用处,我真的看不出这种情况。之所以引起我的注意,大多数语言缺乏这个是我需要它(我使用Ruby,所以我编写了一个方法将整数转换为布尔值,然后使用按位XOR,这在布尔行为就像逻辑XOR)
使用按位XOR也不起作用,因为它会产生不同的结果。
0b0001 ^ 0b1000 = 0b1001 (True)
0b0001 XOR 0b1000 = False
// Where ^ is bitwise exclusive or and XOR is logical exclusive or
// Using != (not equal to) also doesn't work
0b0001 != 0b1000 = True
那么为什么大多数语言都不包含逻辑异或操作符?
编辑:我添加了一个示例,其中!=
也没有按照我想要的方式执行操作,它几乎可以,但会落入相同的问题中bitwise exclusive或者,它只有在你知道你正在使用零或一个而不是任何其他数字时才有效。
值得注意的是,这假设语言使用零作为false,非零作为true。
答案 0 :(得分:19)
几乎每种语言都有逻辑异或。他们使用的符号各不相同,但无论符号如何,大多数人都认为它“不相等”。
编辑:对于那些怀疑的人,测试三个变量的代码:
#include <iostream>
int main() {
for (int i=0; i<2; i++)
for (int j=0; j<2; j++)
for (int k=0; k<2; k++) {
std::cout << "\n!=" << (i!=j!=k);
std::cout << "\t^ " << (i^j^k);
}
return 0;
}
答案 1 :(得分:6)
“逻辑XOR运算符”是什么意思?我不确定你对你的例子有什么期望,但这是我的答案:
a (logical XOR) b
与bool(a) != bool(b)
不平等是一种逻辑异或。由于您已经具有按位XOR版本,因此逻辑版本不需要特殊的运算符。
答案 2 :(得分:5)
您还可以编写!a ^ !b
以获得与逻辑xor相同的效果。
您可能在编程语言中找不到逻辑xor,因为:
答案 3 :(得分:3)
我能想到的唯一原因是手术比较少见。我不明白为什么^^这样的东西不能分配给它,也许设计语言的人想避免操作员混乱。
由于它无法短路,因为它不能被短路,在许多强类型语言中你不能使用按位XOR运算符来比较布尔值而不来回摆动,在这种情况下甚至是非短路逻辑异或将有意义。
答案 4 :(得分:3)
好的,所以你正在寻找一个字节明智的独占或位明智的独占或。看起来你正在寻找一些可以在一个字节上操作的东西,如“开”或“关”,因为字节是“0”或“非零”,然后对它们进行异或。听起来你真的想要将每个字节压缩成一个指示真或假的位。所以,听起来你想要(a!= 0)^(b!= 0)
a b a YOURXOR b a!=0 b!=0 (a!=0)^(b!=0) 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 7 0 1 1 0 1 0 7 1 0 1 1 3 7 0 1 1 0 7 3 0 1 1 0 7 7 0 1 1 0
至于为什么不是每种语言......我都无法回答。然而,使用每种语言的按位xor构建块并不是那么困难,并且没有语言提供所有可能的功能 - 它们只是提供足够的功能来让您构建可能需要的扩展功能。哦,如果这是一个很受欢迎的问题,那么你可以期待看到它的各个库或宏;虽然我可能没有对这些libs /代码进行充分的搜索,但我自己并没有发现任何问题,这表明要求要么是微不足道,要么是利基要求。
答案 5 :(得分:1)
可能因为XOR通常不需要作为逻辑运算符,你可以像这样轻松地完成它:
// foo xor bar
(foo & !bar) || (bar & !foo)
// or like this (assuming foo and bar are booleans)
!(foo==bar)
// assume boleans that can be cast as integers with true=1 and false=0
// foo XOR bar XOR baz XOR alice
((int)foo + (int)bar + (int)baz + (int)alice)&0b1