Apakah ada operator XNOR (Logical biconditional) di C #?

136

Saya baru mengenal C # dan tidak dapat menemukan operator XNOR untuk menyediakan tabel kebenaran ini:

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

Apakah ada operator khusus untuk ini? Atau saya perlu menggunakan! (A ^ B)?

trailmax
sumber
94
Operator ini lebih dikenal sebagai ==operan boolean ...
Magnus Hoff
@ Magnus Hoff: poin yang sangat bagus!
sll
24
Saya pikir ungkapan "tidak bisa melihat kayu untuk pohon" sangat tepat di sini. Voting naik karena kita semua pernah ke sini sekali atau dua kali;)
pemboros
1
Mungkin OP iz l33t k! D yang ingin menulis shellcodez yang luar biasa dan perlu menyembunyikan operasi perbandingan. Itu kemungkinan ...
Kerrek SB
4
maaf, Kerrek, saya bukan dari kerumunan itu. Dan pemboros ada di sini -)
trailmax

Jawaban:

250

XNOR hanyalah persamaan pada boolean; gunakan A == B.

Ini adalah hal yang mudah untuk dilewatkan, karena kesetaraan tidak umum diterapkan pada boolean. Dan ada bahasa di mana itu tidak selalu berhasil. Misalnya, dalam C, nilai skalar non-nol dianggap benar, sehingga dua nilai "benar" bisa tidak sama. Tapi pertanyaannya sudah ditandai, yang telah, harus kita katakan, para boolean berperilaku baik.

Perhatikan juga bahwa ini tidak menggeneralisasi ke operasi bitwise, di mana Anda inginkan 0x1234 XNOR 0x5678 == 0xFFFFBBB3(dengan asumsi 32 bit). Untuk itu, Anda perlu membangun dari operasi lain, seperti ~(A^B). (Catatan:, ~bukan !.)

Keith Thompson
sumber
6
Dalam C, !operator dapat digunakan untuk mengkonversi int's untuk 'berperilaku baik' boolean: !a==!b.
ivan_pozdeev
2
@ivan_pozdeev Dan !!(itu dua operator "bukan" yang logis) menormalkan nilai skalar apa pun ke 0atau 1.
Keith Thompson
5

XOR = A atau B, tetapi Bukan A & B atau keduanya (Tidak bisa sama dengan [! =])
Karena itu XNOR adalah oposisi yang tepat, dan dapat dengan mudah diwakili oleh == atau ===.

Namun, kasus non-boolean menimbulkan masalah, seperti dalam contoh ini:

a = 5
b = 1

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

alih-alih, gunakan ini:

a = 5
b = 1

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

atau

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

contoh pertama akan mengembalikan false (5! = 1), tetapi yang kedua akan mengembalikan true (nilai []? )

contoh alt hanyalah gerbang yang dibalik (a || b) &&! (a && b) (XOR)

Braden Best
sumber
3

Tidak, Anda harus menggunakan !(A^B)

Meskipun saya kira Anda bisa menggunakan overloading operator untuk membuat XNOR Anda sendiri.

Grifon
sumber
1
Ini bitwise, tidak logis
sll
Saya pikir poster itu tahu bahwa dia memasukkannya ke dalam pertanyaannya.
Griffin
4
@ Slv, Anda hampir membuat saya, saya harus mengeceknya. Dalam C # ^ adalah logis jika dioperasikan pada boolean. Jika dioperasikan pada tipe integral, itu bitwise. Silakan lihat msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax
@trailmax: hal-hal keren, terima kasih telah menunjukkan ini! Sungguh iblis ada dalam detail!
sll
-6

Anda dapat menggunakan ===operator untuk XNOR. Hanya Anda perlu mengkonversi adan bmenjadi bool.

if (!!a === !!b) {...}
pengguna7797323
sumber
1
hanya C # tidak memiliki ===operator
trailmax
tidak ada jawaban ini yang benar, ===operator non-koersif adalah javascript dan dobel !!sebelum nilai dalam evaluasi tidak valid dalam c # baik
Remi
seperti yang telah dinyatakan, c # tidak memiliki Operator dengan tanda sama dengan rangkap tiga.
cramopy
=== Bukan operatr di C # ... (===) yang digunakan adalah JavaScript.
Darkcoder