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

Jef*_*rth 11 bit-manipulation language-design

在我的脑海中,我无法想到我使用过的具有逻辑异或操作符的单一语言,但它们都具有逻辑和按位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
Run Code Online (Sandbox Code Playgroud)

那么为什么大多数语言都不包含逻辑独占或运算符?

编辑:我添加了一个例子,!=它也不能做我想要的,它几乎可以,但是遇到了同样的问题,使用按位独占或它,它只有你知道你正在使用零或一个,而不是任何其他数字.

需要注意的是,这假设语言使用零作为false,非零作为true.

Jer*_*fin 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你不能保证布尔上下文,那就是要求微妙的错误. (9认同)
  • 大多数语言都有按位XOR,但不是**逻辑**."不等于"在两个操作数的情况下的作用相同,但我不认为!= b!= c等于XOR b XOR c. (2认同)

vir*_*tor 6

你对"逻辑异或运算符"是什么意思?我不确定你对你的例子有什么期望,但这是我的答案:

a (logical XOR) b 是相同的 bool(a) != bool(b)

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


cdi*_*ins 5

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

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

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


atk*_*atk 4

好的,所以您正在寻找字节级异或与级异或。似乎您正在寻找对字节进行“开”或“关”操作的东西,就像认为字节是“0”或“非零”一样,然后对它们进行异或。听起来确实像是您希望将每个字节压缩为指示真或假的单个位。所以,听起来你想要 (a!=0)^(b!=0)

aba 你的或 ba!=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

至于为什么不是每种语言都如此……我无法真正回答。然而,使用每种语言中可用的按位异或构建块来实现并不是那么困难,并且没有一种语言提供所有可能的功能 - 它们只是提供足够的功能来让您构建可能需要的扩展功能。哦,如果这是一个足够流行的问题,您会期望看到到处都是它的库或宏;虽然我可能没有对此类库/代码进行足够的搜索,但我自己没有找到任何库/代码,这表明该要求要么编写起来很简单,要么是一个利基要求。

  • 我认为 !a^!b 也有效。特别是它在 Ruby 中工作,因为 `!x` 是一个 bool (2认同)