Kenapa C # tidak memiliki XOR
operator bersyarat ?
Contoh:
true xor false = true
true xor true = false
false xor false = false
Kenapa C # tidak memiliki XOR
operator bersyarat ?
Contoh:
true xor false = true
true xor true = false
false xor false = false
& | ^
) vs operator bersyarat ( && ||
). Tapi Anda benar (tentu saja), ada XOR yang logis ...
Jawaban:
Di C #, operator bersyarat hanya menjalankan operan sekundernya jika perlu .
Karena XOR harus secara definisi menguji kedua nilai, versi bersyarat akan menjadi konyol.
Contoh :
DAN Logis: &
- menguji kedua sisi setiap waktu.
Logis ATAU: |
- uji kedua sisi setiap waktu.
AND bersyarat: &&
- hanya menguji sisi ke-2 jika sisi ke-1 benar.
Bersyarat OR: ||
- hanya uji sisi ke-2 jika sisi ke-1 salah.
Pertanyaan agak ketinggalan jaman tapi ...
Begitulah cara kerja operator ini:
true xor false = true
true xor true = false
false xor true = true
false xor false = false
Beginilah caranya! = Operator bekerja dengan tipe bool:
(true != false) // true
(true != true) // false
(false != true) // true
(false != false) // false
Jadi seperti yang Anda lihat yang belum ada ^^
bisa diganti dengan yang sudah ada!=
!=
akan berhasil untuk ini.
AND
dan OR
tetapi tidak ada sebagai XOR
. atau setidaknya kami tidak menyadarinya !=
:) @TheEvilGreebo
Ada operator XOR logis: ^
Dokumentasi: C # Operator dan ^ Operator
^
, jika digunakan dengan operand boolean, adalah operator boolean. "untuk operan bool, operator ^ menghitung hasil yang sama dengan operator pertidaksamaan! =". Anda juga bisa menggunakan bitwise-xor integer operand ^
. C # bukan C.
Hanya sebagai klarifikasi, operator ^ bekerja dengan tipe integral dan bool.
Lihat ^ Operator MSDN (C # Reference) :
Operator biner ^ telah ditentukan sebelumnya untuk tipe integral dan bool. Untuk tipe integral, ^ menghitung bitwise eksklusif-OR dari operannya. Untuk operan bool, ^ menghitung eksklusif logis-atau operannya; Artinya, hasilnya benar jika dan hanya jika salah satu operannya benar.
Mungkin dokumentasinya sudah berubah sejak 2011 ketika pertanyaan ini diajukan.
^
dan mendahului satu per lima tahun ini. Saya ragu ada yang berubah.
Seperti yang ditanyakan oleh Mark L , Ini versi yang benar:
Func<bool, bool, bool> XOR = (X,Y) => ((!X) && Y) || (X && (!Y));
Berikut tabel kebenarannya:
X | Y | Result
==============
0 | 0 | 0
1 | 0 | 1
0 | 1 | 1
1 | 1 | 0
Referensi: Exclusive OR
Oh ya, benar.
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
i1
, sama seperti byte). Ini adalah perilaku yang 100% ditentukan dan dikelola dengan aman. CLR tidak dibuat kasar .; Pertama kali saya melihat perilaku ini adalah saat menggunakan Microsoft Pex.
Xor bersyarat tidak ada, tetapi Anda dapat menggunakan logika yang logis karena xor didefinisikan untuk boolean, dan semua perbandingan bersyarat dievaluasi menjadi boolean.
Jadi Anda bisa mengatakan sesuatu seperti:
if ( (a == b) ^ (c == d))
{
}
1
. Ini adalah fakta yang sedikit diketahui. Anda bisa berakhir dalam situasi di mana xor dari dua boolean bukan salah masih tetap tidak salah! Yang mengatakan dalam kode khusus ini operator xor hanya pernah diterapkan ke nilai dalam [0,1] sehingga komentar saya tidak berlaku (sepenuhnya).
&
juga rentan.
&&
seolah-olah itu &
adalah kesalahan kompilasi.
Meskipun ada operator xor logis^
, tidak ada operator xor bersyarat . Anda dapat mencapai xor bersyarat dari dua nilai A dan B menggunakan berikut ini:
A ? (!B) : B
Paren tidak perlu, tetapi saya menambahkannya untuk kejelasan.
Seperti keluar menunjuk oleh The Evil Greebo, mengevaluasi ini baik ekspresi, tapi xor tidak dapat hubung singkat seperti dan dan atau .
0101 ^ 0011
memiliki nilai 0110
.
Tidak ada yang namanya XOR bersyarat (korsleting). Operator bersyarat hanya berarti jika ada cara untuk secara pasti memberi tahu hasil akhir dari hanya melihat argumen pertama. XOR (dan penjumlahan) selalu membutuhkan dua argumen, jadi tidak ada cara untuk melakukan hubungan pendek setelah argumen pertama.
Jika Anda mengetahui A = true, maka (A XOR B) =! B.
Jika Anda mengetahui A = salah, maka (A XOR B) = B.
Dalam kedua kasus tersebut, jika Anda mengetahui A tetapi tidak B, maka Anda tidak cukup tahu untuk mengetahui (A XOR B). Anda harus selalu mempelajari nilai A dan B untuk menghitung jawabannya. Secara harfiah tidak ada kasus penggunaan di mana Anda dapat menyelesaikan XOR tanpa kedua nilai tersebut.
Perlu diingat, XOR menurut definisi memiliki empat kasus:
false xor true = true
true xor false = true
true xor true = false
false xor false = false
Sekali lagi semoga dari penjelasan di atas sudah jelas bahwa mengetahui nilai pertama tidak pernah cukup untuk mendapatkan jawaban tanpa juga mengetahui nilai kedua. Namun, dalam pertanyaan Anda, Anda mengabaikan kasus pertama. Jika Anda malah menginginkan
false op true = false (or DontCare)
true op false = true
true op true = false
false op false = false
maka Anda memang bisa mendapatkannya dengan operasi bersyarat hubung singkat:
A && !B
Tapi itu bukan XOR.
Pertanyaan ini telah dijawab dengan efektif, tetapi saya menemukan situasi yang berbeda. Benar bahwa XOR bersyarat tidak diperlukan. Benar juga bahwa operator ^ dapat digunakan. Namun, jika Anda hanya perlu menguji status "true || false" dari operan maka ^ dapat menyebabkan masalah. Sebagai contoh:
void Turn(int left, int right)
{
if (left ^ right)
{
//success... turn the car left or right...
}
else
{
//error... no turn or both left AND right are set...
}
}
Dalam contoh ini, jika kiri disetel ke 10 (0xa) dan kanan disetel ke 5 (0x5) cabang "sukses" dimasukkan. Untuk contoh ini (sederhana jika konyol), ini akan menghasilkan bug karena Anda tidak boleh berbelok ke kiri DAN kanan pada saat yang bersamaan. Apa yang saya kumpulkan dari penanya bukanlah bahwa dia sebenarnya menginginkan kondisional, tetapi cara sederhana untuk melakukan benar / salah pada nilai yang diteruskan ke xor.
Makro bisa melakukan trik:
#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )
Jangan ragu untuk menampar saya jika saya melenceng: o)
Saya membaca jawaban jimreed di bawah ini setelah saya memposting ini (Yapdog buruk!) Dan ini sebenarnya lebih sederhana. Itu akan berhasil dan saya sama sekali tidak tahu mengapa jawabannya ditolak ...
if
membutuhkan ekspresi Boolean, itu bahkan tidak akan dikompilasi dengan int.
!=
bekerja sebagai penggantinya?