Pengamatan:
Java memiliki operator AND yang logis.
Java memiliki operator ATAU logis.
Java memiliki operator NOT logis.
Masalah:
Java tidak memiliki operator XOR yang logis, menurut sun . Saya ingin mendefinisikan satu.
Definisi metode:
Sebagai metode, ia didefinisikan sebagai berikut:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
Panggilan metode:
Metode ini disebut dengan cara berikut:
boolean myVal = logicalXOR(x, y);
Penggunaan Operator:
Saya lebih suka memiliki operator, digunakan sebagai berikut:
boolean myVal = x ^^ y;
Pertanyaan:
Saya tidak dapat menemukan apa pun tentang cara mendefinisikan operator baru di Jawa. Di mana saya harus mulai?
!=
, ada juga XNOR logis yang disebut==
Jawaban:
Java memang memiliki operator XOR logis , itu adalah ^ (seperti dalam
a ^ b
).Selain itu, Anda tidak dapat menentukan operator baru di Jawa.
Sunting: Ini contohnya:
Keluaran:
sumber
Bukankah x! = Y?
sumber
a != b != c
tidak akan berhasil, tetapia ^ b ^ c
akankah? Kalau begitu, Anda salah .new Boolean(true) != new Boolean(true)
memberitrue
.Salah.
Jawa memiliki
XOR hanya ada sebagai ^, karena evaluasi hubungan pendek tidak dimungkinkan.
sumber
Mungkin Anda salah memahami perbedaan antara
&
dan&&
,|
dan||
Tujuan dari operator pintas&&
dan||
adalah bahwa nilai operan pertama dapat menentukan hasil dan sehingga operan kedua tidak perlu dievaluasi.Ini sangat berguna jika operan kedua akan menghasilkan kesalahan. misalnya
Namun dengan XOR , Anda selalu harus mengevaluasi operan kedua untuk mendapatkan hasil sehingga satu-satunya operasi yang berarti adalah
^
.sumber
Anda bisa menulis
(a!=b)
Ini akan bekerja sama seperti cara
a ^ b
.sumber
Itu karena operator kelebihan beban adalah sesuatu yang secara khusus mereka tinggalkan dari bahasa. Mereka "menipu" sedikit dengan penggabungan string, tetapi lebih dari itu, fungsi seperti itu tidak ada.
(Penafian: Saya belum bekerja dengan 2 rilis utama terakhir java, jadi jika sekarang, saya akan sangat terkejut)
sumber
Satu-satunya operator kelebihan beban di Jawa adalah + on Strings ( JLS 15.18.1 String Concatenation Operator + ).
Komunitas telah dibagi menjadi 3 selama bertahun-tahun, 1/3 tidak menginginkannya, 1/3 menginginkannya, dan 1/3 tidak peduli.
Anda dapat menggunakan unicode untuk membuat nama metode yang merupakan simbol ... jadi jika Anda memiliki simbol yang ingin Anda gunakan, Anda dapat melakukan myVal = x. $ (Y); di mana $ adalah simbol dan x bukan primitif ... tapi itu akan menjadi cerdik di beberapa editor dan membatasi karena Anda tidak dapat melakukannya pada primitif.
sumber
Berikut kode Anda:
berlebihan.
Mengapa tidak menulis:
?
Juga, seperti kata javashlook , sudah ada
^
operator.!=
dan^
bekerja secara identik * untuk operan boolean (kasing Anda), tetapi berbeda untuk operan bilangan bulat.* Catatan:
1. Mereka bekerja secara identik untuk
boolean
(tipe primitif), tetapi tidak untukBoolean
(tipe objek) operan. SebagaiBoolean
(tipe objek) nilai dapat memiliki nilainull
. Dan!=
akan kembalifalse
atautrue
ketika salah satu atau kedua operannyanull
, sementara^
akan melemparNullPointerException
dalam kasus ini.2. Meskipun mereka bekerja secara identik, mereka memiliki prioritas yang berbeda, misalnya ketika digunakan dengan
&
:a & b != c & d
akan diperlakukan sebagaia & (b != c) & d
, sementaraa & b ^ c & d
akan diperlakukan sebagai(a & b) ^ (c & d)
(offtopic: aduh, tabel presedensi gaya-C menyebalkan).sumber
!=
Boolean
nilai!=
berfungsi dengan tidak benar. Untukboolean
nilai tidak masalah.Berikut adalah metode vor arg XOR untuk java ...
Nikmati
sumber
XOR(true,true,true)
mengembalikan true, yang sepertinya tidak seperti apa yang Anda harapkan dari metode yang disebutXOR
. Tingkah laku saya yang diharapkan adalah bahwa itu selalu mengembalikan false (yang tentu saja tidak membantu)Logikanya eksklusif-atau di Jawa disebut
!=
. Anda juga dapat menggunakan^
jika Anda ingin membingungkan teman-teman Anda.sumber
Anda dapat menggunakan Xtend (Operator Infix dan Operator Overloading) untuk membebani operator dan 'tetap' di Jawa
sumber
^
; kamu harus menggunakanbool_1.xor(bool_2)
. Anehnya, pengurai bahkan tidak memungkinkan Anda untuk menggunakan tanda sisipan; Anda harus menggunakanxor
untuk boolean danbitwiseXor
untuk bilangan bulat. Anda bisa, tentu saja, membebani operator lain, tetapi itu akan sangat membingungkan.Apa yang Anda minta tidak masuk akal. Kecuali jika saya salah Anda menyarankan Anda ingin menggunakan XOR untuk melakukan operasi logis dengan cara DAN dan ATAU yang sama. Kode yang Anda berikan sebenarnya menunjukkan apa yang saya rujuk ke:
Fungsi Anda memiliki input boolean, dan ketika bitwise XOR digunakan pada boolean hasilnya sama dengan kode yang Anda berikan. Dengan kata lain, bitor XOR sudah efisien ketika membandingkan bit individu (boolean) atau membandingkan bit individu dalam nilai yang lebih besar. Untuk memasukkan ini ke dalam konteks, dalam hal nilai-nilai biner nilai non-nol adalah BENAR dan hanya NOL yang salah.
Jadi agar XOR diterapkan dengan cara yang sama dengan logika AND diterapkan, Anda bisa menggunakan nilai biner hanya dengan satu bit (memberikan hasil dan efisiensi yang sama) atau nilai biner harus dievaluasi secara keseluruhan, bukan per bit. Dengan kata lain ungkapan (010 ^^ 110) = FALSE bukan (010 ^^ 110) = 100. Ini akan menghapus sebagian besar makna semantik dari operasi, dan merupakan tes logis yang seharusnya tidak Anda gunakan.
sumber
A dan B harus menjadi nilai boolean untuk membuat! = Sama dengan xor sehingga tabel kebenaran akan terlihat sama. Anda juga bisa menggunakan! (A == B) lol.
sumber
Saya menggunakan kelas yang sangat populer "org.apache.commons.lang.BooleanUtils"
Metode ini diuji oleh banyak pengguna dan aman. Selamat bersenang-senang. Pemakaian:
sumber
Karena tipe data boolean disimpan seperti integer, operator bit ^ berfungsi seperti operasi XOR jika digunakan dengan nilai boolean.
sumber
Ini sebuah contoh:
Diberi 2 nilai int, kembalikan benar jika satu negatif dan satu positif. Kecuali jika parameter "negatif" benar, maka kembalikan hanya benar jika keduanya negatif.
sumber
Anda harus beralih ke Scala untuk mengimplementasikan operator Anda sendiri
contoh pipa
sumber