C#中是否有XNOR(逻辑双条件)运算符?


136

我是C#的新手,找不到XNOR运算符来提供此真值表:

aba XNOR b
----------------
TTT
TFF
FTF
快速傅立叶变换

是否有特定的运算符?还是我需要使用!(A ^ B)?


94
该运算符通常被称为==布尔操作数...
Magnus Hoff

@Magnus Hoff:很好,很好!
sll

24
我认为“看不见树木的树木”在这里非常合适。投票是因为我们都来过这里一次或两次;)
花费者

1
也许OP iz l33t k!d想要编写出色的shellcodez,并且需要以某种方式隐藏比较操作。这有可能...
Kerrek SB 2011年

4
抱歉,Kerrek,我不是那群人。支出者就在这里-)
Trailmax 2011年

Answers:


250

XNOR只是布尔值上的相等;使用A == B

这是一件容易错过的事情,因为平等并不普遍适用于布尔值。在某些语言中,它不一定会起作用。例如,在C语言中,任何非零标量值都被视为true,因此两个“ true”值可能不相等。但是这个问题被加了标签,我们应该说,它们具有行为良好的布尔值。

还要注意,这并不能推广到您想要的位操作0x1234 XNOR 0x5678 == 0xFFFFBBB3(假设32位)。为此,您需要从其他操作中构建,例如~(A^B)。(注意:~,不是!。)


6
在C语言中,!运算符可用于将转换int为“行为良好”的布尔值:!a==!b
ivan_pozdeev 2014年

2
@ivan_pozdeev和!!(这是两个逻辑“非”运算符)将标量值标准化为01
基思·汤普森

5

XOR = A或B,但不是A&B或都不是(不能等于[!=])
,因此XNOR是确切的对数,可以很容易地用==或===表示。

但是,非布尔型情况会出现问题,例如以下示例:

a = 5
b = 1

if (a == b){
...
}

相反,使用以下命令:

a = 5
b = 1

if((a && b) || (!a && !b)){
...
}

要么

if(!(a || b) && (a && b)){
...
}

第一个示例将返回false(5!= 1),但是第二个示例将返回true(a [value?]和b [value?]的值返回相同的布尔值,即true(值=不为0 /有一个值) )

alt示例只是反向(a || b)&&!(a && b)(XOR)门


3

不,您需要使用 !(A^B)

尽管我想您可以使用运算符重载来制作自己的XNOR。


1
这是按位的,而不是合乎逻辑的
sll

我认为发布者知道,因为他已将其包括在问题中。
格里芬

4
@sllev你差点就把我弄明白了,我不得不仔细检查一下。在C#中,如果对布尔值进行操作,^是合乎逻辑的。如果对整数类型进行操作,则按位。请参阅msdn.microsoft.com/en-us/library/zkacc7k1.aspx
Trailmax 2011年

@trailmax:很酷的东西,谢谢你指出这一点!真恶魔详细!
sll

-6

您可以将===运算符用于XNOR。只是您需要转换a并转换b为bool。

if (!!a === !!b) {...}

1
只有C#没有===运算符
Trailmax

此答案均不正确,===非强制性运算符为javascript,并且!!评估值之前的double 在c#中均无效
Remi

如前所述,c#没有三等号运算符。
cramopy

===不是C#中的操作符...(===)是JavaScript。
Darkcoder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.