- Operator Logika di Java
- Operator negasi logis!
- Logis AND - &, serta kondisional AND - &&
- Logis OR adalah operator |, begitu pula OR bersyarat adalah operator ||
- XOR - logika eksklusif OR - operator ^
- Prioritas operasi logis
- Ekspresi logis yang kompleks
- Operator bit-bijaksana (bit-bijaksana).
- Operator bitwise &, | dan ^
- Kode tambahan
- Operator negasi bitwise ~
Operasi Logis di Java
Operasi logika dilakukan menggunakan operator Boolean. Maafkan tautologinya, tapi memang begitulah adanya. Operasi logika dasar (dalam pemrograman dan matematika) dapat diterapkan pada argumen logika (operan), dan juga dapat digunakan untuk membentuk ekspresi yang lebih kompleks, mirip dengan operasi aritmatika pada bilangan. Misalnya ungkapan:
(a | b) | (c < 100) & !(true) ^ (q == 5)
adalah ekspresi logika kompleks dengan empat operan: (a | b)
, di mana а
dan b
merupakan variabel tipe boolean
(c < 100)
(true)
(q == 5)
. Pada gilirannya, ekspresi logika sederhana (a | b)
juga terdiri dari dua argumen operan. Operan logika adalah ekspresi yang dapat dikatakan benar atau salah, benar atau salah . Dalam bahasa Java, operan Boolean merupakan ekspresi bertipe boolean
atau Boolean, misalnya:
(2 < 1)
— operan logis, nilainya salahtrue
- operan logis yang nilainya jelas benarboolean a
- juga bisa menjadi operan logis, seperti Boolean aint a = 2
- bukan operan logis , ini hanya tipe variabelint
String a = "true"
juga bukan operan logis . Ini adalah string yang nilai teksnya adalah"true"
.
- Negasi logis , juga dikenal
NOT
sebagai inversi. Di Java, ini ditandai dengan!
simbol “ ” sebelum operan. Berlaku untuk satu operan. - Logis dan , ini juga merupakan
AND
konjungsi. Ditunjukkan dengan&
simbol “ ” di antara dua operan yang diterapkan. - Logikanya atau di Jawa juga -
OR
, itu juga disjungsi. Di Java, ditandai dengan simbol “|
” di antara dua operan. XOR
Disjungsi eksklusif atau , , tegas. Di Java, ditandai dengan simbol “^
” di antara dua operan.- Di Java, operator logika mencakup kondisional atau , dinotasikan sebagai
||
, serta kondisional dan -&&
.
==
tidak dianggap sebagai operator logika. Perhatian! Di Java, operator logika&
,|
dan^
juga berlaku untuk bilangan bulat. Dalam hal ini, cara kerjanya sedikit berbeda dan disebut operator logika bitwise (atau bitwise). Tentang mereka - menjelang akhir artikel. Mari kita lihat tabel dengan deskripsi singkat dari masing-masing operator logika Java, dan di bawah ini kami akan menjelaskannya lebih detail dan memberikan contoh kode.
operator jawa | Nama | Jenis | Deskripsi Singkat | Contoh |
---|---|---|---|---|
! |
Logis “tidak” (negasi) | Unary | !x berarti “bukan x”. Mengembalikan nilai benar jika operannya salah . Mengembalikan false jika operannya benar . |
boolean x = true; Kemudian // !x == false |
& |
Logika AND ( AND , perkalian) |
Biner | Mengembalikan nilai benar jika kedua operan bernilai benar . | a = true; b = false; Kemudian a & b == false |
| |
Logis OR ( OR , penjumlahan) |
Biner | Mengembalikan nilai benar jika setidaknya salah satu operan bernilai benar . | a = true; b = false; Kemudian a | b == true |
^ |
Eksklusif logis OR ( XOR ) |
Biner | Mengembalikan nilai benar jika hanya satu operan yang bernilai benar . Mengembalikan false jika kedua operan bernilai true atau false . Pada dasarnya, ini mengembalikan nilai true jika operannya berbeda. | a = true; b = false; Kemudian a ^ b == true |
&& |
Bersyarat AND (logis pendek AND) | Biner | Sama seperti , & tetapi jika operan di sebelah kiri & adalah false , operator ini mengembalikan false tanpa memeriksa operan kedua. |
|
|| |
OR bersyarat (logis pendek OR) | Biner | Sama seperti , | tetapi jika operator di sebelah kiri adalah true , operator mengembalikan nilai true tanpa memeriksa operan kedua. |
Operator negasi logis!
Operator ini bersifat unary, artinya berlaku untuk satu ekspresi atau operan Boolean. Sangat mudah untuk memahaminya, seperti negasi lainnya: operator hanya mengubah arti ekspresi menjadi kebalikannya. Tabel kebenaran atau hasil melakukan operasi negasi:Nilai a | !A |
PALSU | BENAR |
BENAR | PALSU |
public class Solution {
public static void main(String[] args) {
boolean a = true;
System.out.println(!a); // here our boolean expression reverses its value
System.out.println(!false); // non-false expression, as you might guess, will be equal to... what?
System.out.println(!(2 < 5)); // expression (2 < 5) is true, so its negation is false
}
}
Output dari program ini adalah sebagai berikut:
false
true
false
Logis AND - &, serta kondisional AND - &&
Logika AND atau konjungsi diterapkan pada dua ekspresi, dan hasilnya akan benar hanya jika kedua operannya benar. Artinya, jika salah satu operana
or b
adalah false , maka ekspresi a & b
akan menjadi false terlepas dari nilai operator kedua. Jika dibayangkan benar adalah angka 1 dan salah adalah 0, maka cara &
kerjanya sama persis dengan perkalian biasa. Oleh karena itu, logika AND sering disebut dengan “perkalian logika”. Dan, omong-omong, fakta ini membantu mengingat pengoperasian operator dengan cepat &
dan tidak membingungkannya dengan operator logika atau |
. Tabel kebenaran AND, juga merupakan hasil kerja operator&
A | B | a&b |
BENAR | BENAR | BENAR |
BENAR | PALSU | PALSU |
PALSU | BENAR | PALSU |
PALSU | PALSU | PALSU |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(a & b); // if we multiply true by false, we will definitely get false
System.out.println(a & c); // true to true will be true
System.out.println(false & (2 > 5));
System.out.println((2 < 5) & false);
// regardless of the truthfulness of the expression in brackets, in which case we have to be content with false
}
}
Hasil dari program ini:
false
true
false
false
Operator &&
kadang-kadang disebut “pendek DAN”. Ini menghasilkan hasil yang sama ketika bekerja dengan operan logis sebagai operator &
. Namun ada perbedaan pada karyanya sendiri. Jadi, Anda telah memperhatikan bahwa jika a & b
operan dalam ekspresi ( ) a
adalah false , maka tidak masuk akal untuk memeriksa nilai operan b
: hasil operasinya pasti false . Jadi jika pada dasarnya kita tidak membutuhkan nilai operan kedua, dengan menggunakannya &&
kita mengurangi jumlah perhitungan dalam program. Jika kita mengganti semua operator dalam contoh &
dengan &&
, hasilnya akan sama persis, tetapi program itu sendiri akan berjalan sedikit lebih cepat (walaupun kita tidak akan menyadarinya, karena kita berbicara tentang mili-mikro... singkatnya , satuan waktu yang sangat kecil).
Logis OR adalah operator |, begitu pula OR bersyarat adalah operator ||
Operator OR pada Java dilambangkan dengan simbol|
. Logika OR atau disjungsi diterapkan pada dua ekspresi, dan hasilnya akan salah jika dan hanya jika kedua operannya salah. Di sini kita sampai batas tertentu mengamati gambaran yang sama seperti dalam kasus operator &
, tetapi justru sebaliknya. Artinya, jika setidaknya satu operan bernilai true , maka ekspresi a | b
dijamin benar berapa pun nilai operator kedua. Jika &
berperilaku seperti perkalian logis, maka OR adalah penjumlahan logis, jika Anda membayangkan bahwa benar adalah 1 dan salah adalah 0. Ingatlah bahwa cara kerja penjumlahan logis berbeda dari penjumlahan normal. 1 + 1 dalam hal ini tidak sama dengan 2, tetapi dengan 1 (angka 2 tidak ada dalam sistem ini). Terkadang disjungsi dipahami sebagai maksimum 0 dan 1, dan dalam hal ini, jika setidaknya satu operan sama dengan 1 ( true ), kita mendapatkan true . Tabel kebenaran OR, dikenal juga sebagai hasil operator |
:
A | B | sebuah | B |
BENAR | BENAR | BENAR |
BENAR | PALSU | BENAR |
PALSU | BENAR | BENAR |
PALSU | PALSU | PALSU |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(!a | b); // Compose the use of two logical operators: a == true, so !a, as we already know, is false.
System.out.println(a | c);
System.out.println((2 < 5) | false); // expression (2 < 5) is true, which means that for any second operand we get a true result
System.out.println((2 > 5) | true);
}
}
Hasil:
false
true
true
true
Jika kita menggunakan operator bersyarat OR - ||
alih-alih |
, kita akan mendapatkan hasil yang persis sama, tetapi, seperti dalam kasus bersyarat AND &&
, ia akan bertindak secara ekonomis: jika kita "menemukan" operan pertama yang sama dengan true , nilai dari operan kedua tidak dicentang, tetapi langsung hasilnya benar .
XOR Java - logika eksklusif OR - operator ^
XOR
, penjumlahan modulo 2, XOR logis, pengurangan logis, disjungsi ketat, komplemen bitwise... operator ^
memiliki banyak nama dalam aljabar Boolean. Hasil penerapan operator ini pada dua operan akan bernilai true jika operandnya berbeda dan false jika operandnya sama. Oleh karena itu, akan lebih mudah untuk membandingkannya dengan mengurangkan angka nol ( false ) dan satu ( true ). Tabel kebenaran XOR
, juga dikenal sebagai hasil operator ^
:
Boolean a | Boolean b | a^b |
BENAR | BENAR | PALSU |
BENAR | PALSU | BENAR |
PALSU | BENAR | BENAR |
PALSU | PALSU | PALSU |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(!a ^ b); // Compose the use of two logical operators: a == true, so !a, as we already know, is false.
System.out.println(a ^ c);
System.out.println((2 < 5) ^ false);
System.out.println((2 > 5) ^ true);
}
}
Hasil:
false
false
true
true
Prioritas operasi logis
Sama seperti dalam matematika, dalam pemrograman operator memiliki urutan eksekusi tertentu ketika muncul dalam ekspresi yang sama. Operator unary memiliki keunggulan dibandingkan operator biner, dan perkalian (bahkan logika) dibandingkan penjumlahan. Kami memberi peringkat operator logika lebih tinggi dalam daftar, semakin tinggi prioritasnya:!
&
^
|
&&
||
&
dan |
) mempunyai prioritas yang berbeda:
public class Solution {
public static void main(String[] args) {
boolean a = true, b = true, c = false;
System.out.println(a | b & c);
}
Jika kita melanjutkan dari kiri ke kanan, yaitu menerapkan operator terlebih dahulu |
lalu - &
, kita akan mendapatkan nilai false . Namun nyatanya, jika Anda menjalankan program ini, Anda akan yakin bahwa outputnya akan benar , karena operator logika AND &
akan memiliki prioritas lebih tinggi daripada operator logika OR |
. Untuk menghindari kebingungan, Anda perlu mengingat apa yang &
berperilaku seperti perkalian dan |
apa yang berperilaku seperti penjumlahan. Anda dapat mengubah urutan prioritas. Gunakan saja tanda kurung, seperti pada matematika sekolah. Mari kita ubah sedikit kode contoh kita:
public class Solution {
public static void main(String[] args) {
boolean a = true, b = true, c = false;
System.out.println((a|b)&c);
}
Ada apa? Pertama kita menggunakan penjumlahan logika dalam tanda kurung, lalu perkalian. Hasilnya salah .
Ekspresi logis yang kompleks
Tentu saja kita dapat menggabungkan ekspresi dan operator Boolean. Mari kita ingat ungkapan dari awal artikel:(a | b) | (c < 100) & !(true) ^ (q == 5)
Sekarang tidak terlihat terlalu menakutkan. Mari kita menulis sebuah program yang menampilkan nilainya, setelah sebelumnya menentukan nilai a
, b
, с
dan q
. Contoh penghitungan nilai ekspresi Boolean kompleks
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
int c = 25;
int q = 2;
System.out.println((a|b) | (c < 100) & !(true)^(q == 5));
}
}
Catatan:Variabel q
kita bertipe int
, tetapi q == 5
ini adalah ekspresi Boolean, dan sama dengan false , karena di atas kita inisialisasi dengan q
angka 2. Begitu pula dengan variabel c
. Angka ini sama dengan 25, tetapi (c < 100) merupakan ekspresi Boolean yang sama dengan true . Hasil dari program ini:
true
Ekspresi Boolean kompleks dapat digunakan untuk menguji kondisi yang sangat kompleks dan bercabang, namun ekspresi tersebut tidak boleh digunakan secara berlebihan: ekspresi tersebut membuat kode sulit dibaca.
Operator bit-bijaksana (bit-bijaksana).
Di awal artikel, kami menyebutkan bahwa operator&
, |
dan ^
dapat digunakan untuk tipe integer Java. Dalam hal ini mereka adalah operator bitwise. Mereka juga disebut bitwise, karena satu digit adalah satu bit, dan operasi ini bekerja secara khusus dengan bit. Tentu saja, cara kerjanya agak berbeda dengan operator logika, dan untuk memahami cara kerjanya, Anda perlu mengetahui apa itu sistem bilangan biner. Jika Anda tidak tahu apa-apa tentangnya atau benar-benar lupa, kami sarankan Anda membaca artikel Java: bits dan bytes terlebih dahulu , dan ingatkan semua orang bahwa dalam sistem bilangan biner hanya ada dua digit - 0 dan 1, dan semua data di komputer direpresentasikan secara tepat dengan menggunakan nol dan satu bersyarat. Angka apa pun yang biasa kita gunakan (desimal; bagi mereka ada 10 digit berbeda dari 0 hingga 9, yang dapat kita gunakan untuk menulis angka apa pun) dapat direpresentasikan dalam sistem bilangan biner. Anda dapat mengubah bilangan desimal ke biner menggunakan pembagian berurutan menjadi kolom menggunakan basis sistem bilangan (2). Sisa pembagian pada setiap langkah, ditulis dalam urutan terbalik, akan menghasilkan bilangan biner yang diinginkan. Di sini, misalnya, konversi angka desimal 103 menjadi representasi biner:
Sistem bilangan biner pada kursus JavaRush Pada kursus JavaRush, mereka berbicara tentang sistem bilangan biner sambil mempelajari pencarian MultiThreading (level 10, kuliah 1), setelah kuliah ada beberapa tugas untuk konsolidasi. Namun, topik ini sama sekali tidak sulit, dan meskipun Anda belum mempelajarinya sejauh itu, kemungkinan besar Anda akan mengetahuinya. |
&
, |
dan ^
Java juga menggunakan operator bitwise:
~
operator negasi bitwise>>
pergeseran bitwise ke kanan>>>
pergeseran kanan bitwise yang tidak ditandatangani<<
pergeseran bitwise ke kiri
Operator bitwise &, | dan ^
Mari kita lihat contoh cara kerja operator ini. Misalkan kita mempunyai dua bilangan bulat:int a = 25;
int b = 112;
Kita perlu menerapkan tiga operasi pada operasi tersebut &
, |
dan ^
menampilkan hasilnya di layar. Berikut kode programnya:
public class Solution {
public static void main(String[] args) {
int a = 25;
int b = 112;
int res1 = a & b;
int res2 = a | b;
int res3 = a ^ b;
System.out.println("a & b = " + res1);
System.out.println("a | b = " + res2);
System.out.println("a ^ b = " + res3);
}
}
Hasil dari program ini adalah sebagai berikut:
a & b = 16
a | b = 121
a ^ b = 105
Jika Anda tidak memahami apa yang terjadi, hasilnya terlihat sangat-sangat misterius. Faktanya, semuanya lebih sederhana dari yang terlihat. Operator bitwise “melihat” nomor operan dalam bentuk binernya. Dan kemudian mereka menerapkan operator logika &
, |
atau ^
ke digit (bit) yang sesuai dari kedua angka. Jadi, untuk &
bit terakhir dari representasi biner dari angka 25 secara logis dijumlahkan dengan bit terakhir dari representasi biner dari angka 112, bit kedua dari belakang dengan yang kedua dari belakang, dan seterusnya: Logika yang sama dapat ditelusuri dalam kasus |
dan ^
.
Sedikit bergeser ke kiri atau ke kanan
Ada beberapa operator pergeseran bit di Java. Operator yang paling umum digunakan<<
adalah dan >>
. Mereka menggeser representasi biner suatu bilangan masing-masing ke kiri atau ke kanan, dan jika terjadi pergeseran ke kanan, sambil mempertahankan tandanya (kami akan menjelaskan apa arti mempertahankan tanda di bawah). Ada lagi operator shift kanan >>>
. Ia melakukan hal yang sama tetapi >>
tidak menyimpan tandanya. Jadi, mari kita lihat pekerjaan mereka menggunakan sebuah contoh. int a = 13
a << 1
menggeser semua bit representasi biner bilangan a ke kiri sebanyak 1 bit. Untuk mempermudah, bayangkan angka 13 dalam biner sebagai 0000 1101. Faktanya, angka ini terlihat seperti ini: 00000000 00000000 00000000 00001101, karena Java int
mengalokasikan 4 byte atau 32 bit untuk angka. Namun, hal ini tidak berperan dalam contoh, jadi dalam contoh ini kita akan menganggap angka kita sebagai satu byte. Bit yang dikosongkan di sebelah kanan diisi dengan angka nol. Sebagai hasil dari operasi ini, kita mendapatkan angka 26. a << 2
Ini menggeser semua bit representasi biner dari angka tersebut a
ke kiri sebanyak 2 bit, dan dua bit yang dikosongkan di sebelah kanan diisi dengan nol. Hasilnya kita akan mendapatkan angka 52. a << 3
Hasilnya adalah 104... Perhatikan polanya? Pergeseran sedikit a
ke kiri sebanyak n posisi berfungsi seperti mengalikan angka a
dengan 2 pangkat n. Hal yang sama berlaku untuk bilangan negatif. Ini -13 << 3
akan memberikan hasil -104. a >> n
menggeser representasi biner dari sejumlah n posisi ke kanan. Misal, 13 >> 1
Ubahlah bilangan 1101 menjadi bilangan 0110 yaitu 6. Dan 13 >> 2
hasilnya adalah 3. Maksudnya disini kita membagi bilangan tersebut dengan 2 pangkat n, dimana n adalah banyaknya pergeseran ke kanan, tetapi dengan satu peringatan: jika angkanya ganjil, selama operasi ini kita sepertinya menyetel ulang bit terakhir angka tersebut. Tetapi dengan hal-hal negatif, situasinya agak berbeda. Katakanlah, coba periksa program apa yang akan dihasilkan jika Anda memintanya melakukan suatu operasi -13 >> 1
. Anda akan melihat angka -7, bukan -6, seperti yang Anda bayangkan. Hal ini terjadi karena cara bilangan negatif disimpan di Java dan bahasa pemrograman lainnya. Mereka disimpan dalam apa yang disebut kode pelengkap. Dalam hal ini, angka paling penting (di sebelah kiri) diberikan di bawah tanda. Untuk bilangan negatif, angka paling penting adalah 1.
Kode tambahan
Mari kita pertimbangkan nomornyaint a = 13
. Jika dalam program Anda mencetak representasi binernya ke konsol menggunakan perintah System.out.println(Integer.toBinaryString(a));
, maka kita akan mendapatkan 1101. Sebenarnya, ini adalah notasi singkat, karena nomor jenis int
memakan 4 byte dalam memori, sehingga komputer lebih “melihatnya” seperti ini:
00000000 00000000 00000000 00001101
Digit paling signifikan adalah nol, artinya kita mempunyai bilangan positif. Untuk mengonversi ke kode tambahan:
-
Kami menulis angka -13 dalam apa yang disebut “kode langsung”. Untuk melakukan ini, ubah digit paling signifikan dari angka tersebut menjadi 1.
Hasil tindakan:10000000 0000000 0000000 00001101
-
Selanjutnya kita balikkan semua bit (kita ubah 0 menjadi 1, dan 1 menjadi 0) kecuali bit tanda. Sebenarnya kami sudah mengubahnya.
Hasil tindakan:11111111 11111111 11111111 11110010
(ya, langkah 1 dan 2 bisa digabungkan, tapi lebih baik dipikir seperti itu)
- Tambahkan 1 ke angka yang dihasilkan
Hasil tindakan:11111111 11111111 11111111 11110011
-13 >> 1
. Karena operator kita >>
mempertahankan tandanya, dalam operasi ini semua bit yang dibebaskan di sebelah kiri tidak diisi dengan nol, tetapi dengan satu. Jadi, menggeser nomornya
11111111 11111111 11111111 11110011
satu bit ke kanan, menghasilkan urutan bit berikut:
11111111 11111111 11111111 11111001
Jika kita mengubah angka ini menjadi kode langsung (yaitu, kurangi 1 terlebih dahulu, lalu balikkan semua bit kecuali yang pertama) kita mendapatkan nomornya:
10000000 00000000 00000000 00000111
atau -7. Sekarang kita telah memahami operator shift kanan yang mempertahankan tanda, akan menjadi jelas perbedaannya dengan operator >>>
. a >>> n
— operasi ini adalah pergeseran yang tidak ditandatangani, yaitu menggeser representasi biner suatu bilangan a
ke kanan sebanyak n bit, tetapi mengisi n bit yang dikosongkan di sebelah kiri bukan dengan satu, seperti operator >>
, tetapi dengan nol. Ayo lakukan operasi -13 >>> 1
. Kita sudah mempunyai bilangan -13
dalam komplemen dua:
11111111 11111111 11111111 11110011
Dengan menggeser ke kanan sebanyak 1 bit dan mengisi bit bebas dengan nol, kita mendapatkan bilangan berikut:
01111111 11111111 11111111 11111001
Apa yang memberi angka dalam notasi desimal 2147483641
.
Operator negasi bitwise ~
Operator unary ini bekerja sangat sederhana: ia membalikkan setiap bit representasi biner dari sebuah bilangan bulat. Mari kita ambil nomornya-13
:
11111111 11111111 11111111 11110011
Operasi negasi bitwise ~13
hanya akan membalikkan nilai setiap bit. Hasilnya kita mendapatkan:
00000000 00000000 00000000 00001100
Atau 12
dalam bentuk desimal.
Kesimpulan singkat
- Semua operator logika berlaku untuk ekspresi Boolean, yaitu operator yang dapat dikatakan benar atau salah .
- Если операторы
&
,|
or^
применяются к числам, речь идёт уже не о логических операциях, а о побитовых. То есть оба числа переводятся в двоичную систему и к этим числам побитово применяют операции логического сложения, умножения or вычитания. - В математической логике операторам
&
и|
соответствуют конъюнкция и дизъюнкция. - Логическое И похоже на умножения 1 (true) и 0 (false).
- Логическое ИЛИ напоминает поиск максимума среди 1 (true) и 0 (false).
- Для побитового отрицания целого числа a используется операция
~a
. - Для логического отрицания булевского выражения a используется операция
!a
. - Отрицательные числа хранятся и обрабатываются в дополнительном codeе.
- Поразрядный сдвиг вправо может сохранять знак (
>>
), а может — не сохранять (>>>
).
GO TO FULL VERSION