Operator bitwise seharusnya melakukan perjalanan variabel dan mengoperasikannya sedikit demi sedikit. Dalam kasus integer, longs, chars ini masuk akal. Variabel ini dapat berisi berbagai nilai yang dipaksakan oleh ukurannya.
Dalam kasus boolean, bagaimanapun, boolean hanya dapat berisi dua nilai. 1 = benar atau 0 = salah. Tetapi ukuran boolean tidak ditentukan. Ini bisa sebesar byte atau sekecil bit.
Jadi, apa efek menggunakan operator bitwise pada boolean? Apakah JVM pada dasarnya menerjemahkannya ke operator logika normal dan melanjutkan? Apakah itu memperlakukan boolean sebagai entitas bit tunggal untuk tujuan operasi? Ataukah hasilnya tidak terdefinisi bersama dengan ukuran boolean?
java
boolean
bitwise-operators
Daniel Bingham
sumber
sumber
Jawaban:
Operator
&
,,^
dan|
adalah operator bitwise ketika operan adalah tipe integral primitif. Mereka adalah operator logika ketika operannya adalah boolean, dan perilakunya dalam kasus terakhir ditentukan. Lihat bagian 15.22.2 dari Spesifikasi Bahasa Java untuk detailnya.sumber
|=
operatornya logis, program seharusnya tidak menjalankanx.getValue()
direktif.a || x.foo()
aman jika x adalah nol, tetapia | x.foo()
tidak.|=
mengikuti aturan yang sama seperti|
.Menggunakan operator bitwise dapat menghindari perilaku hubungan pendek:
Jika
booleanExpression1()
mengevaluasi kefalse
, makabooleanExpression2()
tidak dievaluasi dalam kasus pertama, danbooleanExpression2()
(dan apa pun efek samping mungkin memiliki) yang dievaluasi dalam kasus kedua,sumber
&
akan lebih cepat, tetapi panggilan ke fungsi kedua dapat diabaikan dengan penggunaan&&
Di luar apa yang tercakup dalam jawaban lain, perlu dicatat
&&
dan||
memiliki prioritas yang berbeda dari&
dan|
.Ekstrak dari tabel prioritas (dengan prioritas tertinggi di atas).
Apa artinya ini bagi Anda?
Sama sekali tidak ada, selama Anda tetap berpegang pada hanya
&
dan|
atau hanya&&
dan||
.Namun, karena
|
memiliki prioritas lebih tinggi daripada&&
(sebagai lawan||
, yang memiliki prioritas lebih rendah), mencampurnya secara bebas dapat menyebabkan perilaku yang tidak terduga.Begitu
a && b | c && d
pula dengana && (b | c) && d
,berlawanan dengan
a && b || c && d
yang akan terjadi(a && b) || (c && d)
.Untuk membuktikan bahwa mereka tidak sama, pertimbangkan kutipan dari tabel kebenaran:
Jika Anda ingin OR memiliki prioritas yang lebih tinggi daripada AND, Anda dapat menggunakan
|
dan&&
bersama sama, tetapi ini tidak disarankan.Tetapi Anda benar-benar harus meletakkannya dalam tanda kurung untuk memperjelas prioritas setiap kali menggunakan simbol yang berbeda, yaitu
(a && b) || c
(tanda kurung untuk memperjelas prioritas),a && b && c
(tidak perlu tanda kurung).sumber
Bahkan jika itu akan berhasil, Anda tidak boleh melakukannya. Spesifikasi bahasa menentukan operator bitwise hanya jika kedua operan berjenis integer primitif atau keduanya berjenis boolean. Saya akan mengatakan untuk kasus lain, hasilnya tidak ditentukan:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228
sumber