为什么很多语言缺少逻辑XOR运算符?

时间:2009-12-09 03:51:38

标签: language-design bit-manipulation

在我的脑海中,我无法想到我曾使用过具有逻辑异或运算符的单一语言,但所有语言都具有逻辑和按位andor运算符。

环顾四周,我能找到的唯一原因是独占或不能短路,所以逻辑版本将毫无用处,我真的看不出这种情况。之所以引起我的注意,大多数语言缺乏这个是我需要它(我使用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。

6 个答案:

答案 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) bbool(a) != bool(b)

相同

不平等是一种逻辑异或。由于您已经具有按位XOR版本,因此逻辑版本不需要特殊的运算符。

答案 2 :(得分:5)

您还可以编写!a ^ !b以获得与逻辑xor相同的效果。

您可能在编程语言中找不到逻辑xor,因为:

  • 它不会生成非常有效的汇编代码
  • 经常不需要
  • 语言设计师必须把线放在某处,为什么不用NAND,NOR,NXOR等。

答案 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