C # XNOR (Mantıksal iki yönlü) operatörü var mı?


136

C # için yeniyim ve bu doğruluk tablosunu sağlamak için XNOR işlecini bulamadım :

aba XNOR b
----------------
TTT
TFF
FTF
FFT

Bunun için özel bir operatör var mı? Yoksa kullanmalıyım! (A ^ B)?


94
Bu operatör daha çok ==boole işlenenleri olarak bilinir ...
Magnus Hoff

@Magnus Hoff: güzel çok hoş bir nokta!
sll

24
"Ağaçlar için ahşabı göremiyorum" ifadesinin burada çok uygun olduğunu düşünüyorum. Oylama çünkü hepimiz bir veya iki kez buradayız;)
spender

1
Belki müthiş shellcodez yazmak isteyen ve bir şekilde karşılaştırma işlemini gizlemek isteyen OP iz l33t k! D. Bu bir olasılık ...
Kerrek SB

4
üzgünüm Kerrek, o kalabalıktan değilim. Ve
harcı

Yanıtlar:


250

XNOR basitçe booleans eşitliğidir; kullanın A == B.

Bu, kaçırılması kolay bir şeydir, çünkü eşitlik genellikle booleanlara uygulanmaz. Ve mutlaka işe yaramayacağı diller var. Örneğin, C'de sıfır olmayan herhangi bir skaler değer true olarak kabul edilir, bu nedenle iki "true" değeri eşit olmayabilir. Ancak soru etiketlendidiyelim ki iyi davranmış booleanlar.

Bunun, istediğiniz yerde bitsel işlemlere genelleme olmadığını da unutmayın 0x1234 XNOR 0x5678 == 0xFFFFBBB3(32 bit varsayarak). Bunun için, diğer operasyonlardan, örneğin ~(A^B). (Not: ~değil !.)


6
C yılında !operatör dönüştürmek için kullanılabilir int' 'uslu' boolelerde için s: !a==!b.
ivan_pozdeev

2
@ivan_pozdeev Ve !!(bu iki mantıksal "değil" operatörü) 0veya için herhangi bir skaler değeri normalleştirir 1.
Keith Thompson

5

XOR = A veya B, ancak A & B değil veya hiçbiri (Eşit olamaz [! =])
Bu nedenle XNOR tam tersidir ve == veya === ile kolayca temsil edilebilir.

Bununla birlikte, boolean olmayan vakalar, bu örnekte olduğu gibi sorunlar ortaya çıkarır:

a = 5
b = 1

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

bunun yerine şunu kullanın:

a = 5
b = 1

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

veya

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

ilk örnek false değerini döndürür (5! = 1), ancak ikincisi true değerini döndürür (a [değer?] ve b [değer?] değerleri aynı boole değerini döndürür, true (değer = 0 değil / bir değer vardır )

alt örneği sadece ters (a || b) &&! (a && b) (XOR) kapısıdır


3

Hayır, kullanmalısın !(A^B)

Sanırım kendi XNOR'unuzu yapmak için operatör aşırı yüklemesini kullanabilirsiniz.


1
Bu bitsel, mantıklı değil
sll

Bence poster bunu sorusuna dahil ederken biliyor.
Griffin

4
@sllev neredeyse beni yakaladın, iki kez kontrol etmek zorunda kaldım. C # ^ mantıksal olarak çalıştırılırsa mantıksaldır. İntegral tiplerde çalıştırılırsa, bitseldir. Lütfen msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax

@trailmax: harika şeyler, buna işaret ettiğiniz için teşekkürler! Gerçekten şeytan ayrıntıda!
sll

-6

===XNOR için operatör kullanabilirsiniz . Sadece dönüştürmeniz ave bbool etmeniz gerekiyor .

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

1
sadece C # ===operatörü yok
trailmax

bu cevabın hiçbiri doğru değil, ===zorlayıcı olmayan operatör javascripttir ve !!bir değerlendirmedeki bir değerden önce gelen çift c # için de geçerli değildir
Remi

Daha önce de belirtildiği gibi, c # 'da üçlü eşittir işaret Operatörü yoktur.
cramopy

=== C # bir operatr değil ... (===) JavaScript kullanılır.
Darkcoder
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.