- Operator Logik di Jawa
- Operator penafian logik !
- Logik DAN - &, serta bersyarat DAN - &&
- Logik OR ialah operator |, serta OR bersyarat ialah operator ||
- XOR - logik eksklusif ATAU - pengendali ^
- Keutamaan operasi logik
- Ungkapan logik yang kompleks
- Pengendali bitwise (bitwise).
- Pengendali bitwise &, | dan ^
- Kod tambahan
- Operator penafian bitwise ~
Operasi Logik di Jawa
Operasi logik dilakukan menggunakan operator Boolean. Maafkan tautologi, tetapi inilah keadaannya. Operasi logik asas (dalam pengaturcaraan dan matematik) boleh digunakan pada hujah logik (operand), dan juga boleh digunakan untuk membentuk ungkapan yang lebih kompleks, serupa dengan operasi aritmetik pada nombor. Contohnya ungkapan:
(a | b) | (c < 100) & !(true) ^ (q == 5)
ialah ungkapan logik kompleks dengan empat operan: (a | b)
, di mana а
dan b
ialah pembolehubah jenis boolean
(c < 100)
(true)
(q == 5)
. Sebaliknya, ungkapan logik ringkas (a | b)
juga terdiri daripada dua hujah operan. Operan logik ialah ungkapan yang boleh dikatakan benar atau salah, benar atau salah . Dalam bahasa Java, operan Boolean ialah ungkapan jenis boolean
atau Boolean, sebagai contoh:
(2 < 1)
— operan logik, nilainya palsutrue
- operan logik yang nilainya jelas benarboolean a
- juga boleh menjadi operan logik, seperti Boolean aint a = 2
- bukan operan logik , ia hanyalah pembolehubah jenisint
String a = "true"
juga bukan operan logik . Ini ialah rentetan yang nilai teksnya ialah"true"
.
- Penafian logik , juga dikenali
NOT
sebagai penyongsangan. Di Jawa, ia ditunjukkan oleh!
simbol “ ” sebelum operan. Berlaku pada satu operan. - Logik dan , ia juga merupakan
AND
kata hubung. Ditandakan dengan&
simbol “ ” antara dua operan yang digunakan. - Logik atau dalam Java , ia juga -
OR
, ia juga disjunction. Di Jawa, ia ditunjukkan oleh simbol “|
” antara dua operan. - Eksklusif atau ,
XOR
, perpecahan yang ketat. Di Jawa, ia ditunjukkan oleh simbol “^
” antara dua operan. - Di Java, operator logik termasuk bersyarat atau , dilambangkan sebagai
||
, serta bersyarat dan -&&
.
==
tidak dianggap sebagai pengendali logik. Perhatian! Di Java, operator logik&
,|
dan^
juga digunakan untuk integer. Dalam kes ini, ia berfungsi sedikit berbeza dan dipanggil operator logik bitwise (atau bitwise). Mengenai mereka - menjelang akhir artikel. Mari lihat jadual dengan penerangan ringkas bagi setiap operator logik Java, dan di bawah kami akan menerangkannya dengan lebih terperinci dan memberikan contoh kod.
pengendali Java | Nama | taip | Penerangan Ringkas | Contoh |
---|---|---|---|---|
! |
Logik "tidak" (negasi) | Unary | !x bermaksud “bukan x”. Mengembalikan benar jika operan adalah palsu . Mengembalikan palsu jika operan adalah benar . |
boolean x = true; Kemudian // !x == false |
& |
Logik DAN ( AND , pendaraban) |
binari | Mengembalikan benar jika kedua-dua operan adalah benar . | a = true; b = false; Kemudian a & b == false |
| |
Logik ATAU ( OR , tambahan) |
binari | Mengembalikan benar jika sekurang-kurangnya satu daripada operan adalah benar . | a = true; b = false; Kemudian a | b == true |
^ |
Logik eksklusif ATAU ( XOR ) |
binari | Mengembalikan benar jika satu dan hanya satu operan adalah benar . Mengembalikan salah jika kedua-dua operan adalah benar atau salah . Pada asasnya, ia kembali benar jika operan berbeza. | a = true; b = false; Kemudian a ^ b == true |
&& |
Bersyarat DAN (logik pendek DAN) | binari | Sama seperti , & tetapi jika operan di sebelah kiri & adalah false , operator ini mengembalikan false tanpa menyemak operan kedua. |
|
|| |
Bersyarat ATAU (logik pendek ATAU) | binari | Sama seperti , | tetapi jika operator di sebelah kiri adalah true , operator mengembalikan true tanpa menyemak operan kedua. |
Operator penafian logik !
Operator ini adalah unary, bermakna ia digunakan pada satu ungkapan atau operan Boolean. Ia sangat mudah untuk difahami, seperti mana-mana penafian: pengendali hanya menukar makna ungkapan kepada sebaliknya. Jadual kebenaran atau keputusan menjalankan operasi penolakan:Nilai a | !a |
salah | benar |
benar | salah |
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 program adalah seperti berikut:
false
true
false
Logik DAN - &, serta bersyarat DAN - &&
Logik AND atau kata hubung digunakan pada dua ungkapan, dan hasilnya akan benar hanya jika kedua-dua operan adalah benar. Iaitu, jika salah satu daripadaa
atau operan b
adalah false , maka ungkapan itu a & b
akan menjadi palsu tanpa mengira nilai pengendali kedua. Jika anda membayangkan bahawa benar ialah nombor 1 dan palsu ialah 0, maka pengendali &
berfungsi sama seperti pendaraban biasa. Oleh itu, logik DAN sering dipanggil "pendaraban logik." Dan, dengan cara ini, fakta ini membantu dengan cepat mengingati operasi pengendali &
dan tidak mengelirukannya dengan logik atau operator |
. Jadual kebenaran DAN, ia juga merupakan hasil kerja pengendali&
a | b | a&b |
benar | benar | benar |
benar | salah | salah |
salah | benar | salah |
salah | salah | salah |
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 program:
false
true
false
false
Pengendali &&
kadangkala dipanggil "pendek DAN". Ia menghasilkan hasil yang sama apabila bekerja dengan operan logik sebagai pengendali &
. Walau bagaimanapun, terdapat perbezaan dalam karyanya sendiri. Jadi, anda sudah perasan bahawa jika a & b
operan dalam ungkapan ( ) a
adalah false , maka tidak masuk akal untuk menyemak nilai operan b
: hasil operasi pasti akan false . Oleh itu, jika kita pada asasnya tidak memerlukan nilai operan kedua, menggunakannya &&
kita mengurangkan bilangan pengiraan dalam atur cara. Jika kita menggantikan semua pengendali dalam contoh &
dengan &&
, hasilnya akan sama, tetapi program itu sendiri akan berjalan sedikit lebih cepat (walaupun kita tidak akan perasan ini, kerana kita bercakap tentang mili-mikro... ringkasnya , unit masa yang sangat kecil).
Logik OR ialah operator |, serta OR bersyarat ialah operator ||
Operator OR dalam Java diwakili oleh simbol|
. ATAU logik atau disjungsi digunakan pada dua ungkapan, dan hasilnya akan menjadi palsu jika dan hanya jika kedua-dua operan adalah palsu. Di sini kita sedikit sebanyak memerhatikan gambar yang sama seperti dalam kes operator &
, tetapi sebaliknya. Iaitu, jika sekurang-kurangnya satu operan adalah benar , maka ungkapan itu a | b
dijamin benar tanpa mengira nilai pengendali kedua. Jika &
ia berkelakuan seperti pendaraban logik, maka OR ialah penambahan logik, jika anda bayangkan bahawa benar ialah 1 dan palsu ialah 0. Ingatlah bahawa penambahan logik berfungsi secara berbeza daripada penambahan biasa. 1 + 1 dalam kes ini adalah sama bukan dengan 2, tetapi dengan 1 (nombor 2 semata-mata tidak wujud dalam sistem ini). Kadang-kadang percanggahan difahami sebagai maksimum 0 dan 1, dan dalam kes ini, jika sekurang-kurangnya satu operan adalah sama dengan 1 ( benar ), kita mendapat betul-betul benar . ATAU jadual kebenaran, juga dikenali sebagai hasil pengendali |
:
a | b | a | b |
benar | benar | benar |
benar | salah | benar |
salah | benar | benar |
salah | salah | salah |
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);
}
}
Keputusan:
false
true
true
true
Jika kita menggunakan operator bersyarat ATAU - ||
bukannya |
, kita akan mendapat keputusan yang betul-betul sama, tetapi, seperti dalam kes bersyarat AND &&
, ia akan bertindak secara ekonomi: jika kita "terhadap" operan pertama sama dengan true , nilai operan kedua tidak disemak, tetapi serta-merta hasilnya adalah benar .
XOR Java - logik eksklusif ATAU - pengendali ^
XOR
, penambahan modulo 2, XOR logik, penolakan logik, disjungsi ketat, pelengkap bitwise... operator ^
mempunyai banyak nama dalam algebra Boolean. Hasil daripada menggunakan operator ini kepada dua operan akan menjadi benar jika operan adalah berbeza dan palsu jika operan adalah sama. Oleh itu, adalah mudah untuk membandingkannya dengan menolak sifar ( palsu ) dan satu ( benar ). Jadual kebenaran XOR
, juga dikenali sebagai hasil pengendali ^
:
Boolean a | Boolean b | a^b |
benar | benar | salah |
benar | salah | benar |
salah | benar | benar |
salah | salah | salah |
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);
}
}
Keputusan:
false
false
true
true
Keutamaan operasi logik
Sama seperti dalam matematik, dalam pengendali pengaturcaraan mempunyai susunan pelaksanaan tertentu apabila ia muncul dalam ungkapan yang sama. Operator unary mempunyai kelebihan berbanding yang binari, dan pendaraban (malah logik) berbanding penambahan. Kami telah meletakkan pengendali logik lebih tinggi dalam senarai, lebih tinggi keutamaan mereka:!
&
^
|
&&
||
&
dan |
) mempunyai keutamaan yang berbeza:
public class Solution {
public static void main(String[] args) {
boolean a = true, b = true, c = false;
System.out.println(a | b & c);
}
Jika kami telah bekerja dari kiri ke kanan, iaitu, mula-mula menggunakan operator |
dan kemudian - &
, kami akan menerima nilai false . Tetapi sebenarnya, jika anda menjalankan program ini, anda akan pasti bahawa output akan benar , kerana operator logik AND &
akan mempunyai keutamaan yang lebih tinggi daripada operator OR logik |
. Untuk mengelakkan kekeliruan, anda perlu ingat bahawa apa &
yang berkelakuan seperti pendaraban dan |
apa yang berkelakuan seperti penambahan. Anda boleh menukar susunan keutamaan. Hanya gunakan kurungan, sama seperti dalam matematik sekolah. Mari kita ubah kod contoh kita sedikit:
public class Solution {
public static void main(String[] args) {
boolean a = true, b = true, c = false;
System.out.println((a|b)&c);
}
Apa khabar? Mula-mula kita menggunakan penambahan logik dalam kurungan, dan kemudian pendaraban. Hasilnya akan menjadi palsu .
Ungkapan logik yang kompleks
Sudah tentu, kita boleh menggabungkan ungkapan dan pengendali Boolean. Mari kita ingat ungkapan dari awal artikel:(a | b) | (c < 100) & !(true) ^ (q == 5)
Sekarang ia tidak kelihatan begitu menakutkan. Mari tulis atur cara yang memaparkan nilainya, setelah sebelumnya menentukan nilai a
, b
, с
dan q
. Contoh pengiraan nilai ungkapan Boolean yang 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:pembolehubah q
kami adalah jenis int
, tetapi q == 5
ini adalah ungkapan Boolean, dan ia adalah sama dengan false , kerana di atas kita mulakan dengan q
nombor 2. Begitu juga dengan pembolehubah c
. Nombor ini bersamaan dengan 25, tetapi (c < 100) ialah ungkapan Boolean sama dengan benar . Hasil daripada program ini:
true
Ungkapan Boolean yang kompleks boleh digunakan untuk menguji keadaan yang sangat kompleks dan bercabang, tetapi ia tidak boleh digunakan secara berlebihan: ia menjadikan kod sukar dibaca.
Pengendali bitwise (bitwise).
Pada permulaan artikel, kami menyebut bahawa operator&
, |
dan ^
boleh digunakan berhubung dengan jenis integer Java. Dalam kes ini mereka adalah pengendali bitwise. Mereka juga dipanggil bitwise, kerana satu digit adalah satu bit, dan operasi ini berfungsi secara khusus dengan bit. Sudah tentu, mereka berfungsi agak berbeza daripada operator logik, dan untuk memahami dengan tepat bagaimana, anda perlu tahu apa itu sistem nombor binari. Jika anda tidak tahu apa-apa mengenainya atau terlupa sepenuhnya, kami cadangkan anda membaca dahulu artikel Java: bits and bytes , dan ingatkan orang lain bahawa dalam sistem nombor binari hanya terdapat dua digit - 0 dan 1, dan semua data dalam komputer diwakili tepat dengan menggunakan sifar bersyarat dan satu. Mana-mana nombor yang kita biasa gunakan (perpuluhan; bagi mereka terdapat 10 digit berbeza dari 0 hingga 9, yang mana kita menulis sebarang nombor) boleh diwakili dalam sistem nombor binari. Anda boleh menukar nombor perpuluhan kepada perduaan menggunakan pembahagian berjujukan ke dalam lajur menggunakan asas sistem nombor (2). Baki pembahagian pada setiap langkah, ditulis dalam susunan terbalik, akan memberikan kita nombor perduaan yang dikehendaki. Di sini, sebagai contoh, ialah penukaran nombor perpuluhan 103 kepada perwakilan binari:
Sistem nombor binari dalam kursus JavaRush Dalam kursus JavaRush, mereka bercakap tentang sistem nombor binari semasa mengkaji pencarian MultiThreading (tahap 10, kuliah 1); selepas kuliah terdapat beberapa tugas untuk penyatuan. Walau bagaimanapun, topik ini tidak sukar sama sekali, dan walaupun anda belum sampai sejauh itu dalam kursus ini, anda mungkin akan memahaminya. |
&
, |
dan ^
Java juga menggunakan operator bitwise:
~
pengendali penafian bitwise>>
anjakan sedikit ke kanan>>>
anjakan kanan bitwise tidak ditandatangani<<
anjakan sedikit ke kiri
Pengendali bitwise &, | dan ^
Mari lihat contoh cara pengendali ini berfungsi. Katakan kita mempunyai dua integer:int a = 25;
int b = 112;
Kita perlu menggunakan tiga operasi padanya &
, |
dan ^
memaparkan hasilnya pada skrin. Berikut ialah kod program:
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);
}
}
Keputusan program adalah seperti berikut:
a & b = 16
a | b = 121
a ^ b = 105
Jika anda tidak memahami apa yang berlaku, hasilnya kelihatan sangat, sangat misteri. Malah, semuanya lebih mudah daripada yang kelihatan. Pengendali bitwise "melihat" nombor operan dalam bentuk binari mereka. Dan kemudian mereka menggunakan operator logik &
, |
atau ^
pada digit (bit) yang sepadan bagi kedua-dua nombor. Jadi, untuk &
bit terakhir perwakilan binari nombor 25 secara logiknya menjumlahkan sehingga bit terakhir perwakilan binari nombor 112, bit kedua terakhir dengan satu kedua terakhir, dan seterusnya: Logik yang sama boleh dikesan dalam kes |
dan ^
.
Anjakan sedikit ke kiri atau kanan
Terdapat beberapa operator anjakan bit di Jawa. Pengendali yang paling biasa digunakan<<
ialah dan >>
. Mereka mengalihkan perwakilan binari nombor ke kiri atau kanan, masing-masing, dan dalam kes peralihan ke kanan, sambil mengekalkan tanda (kami akan menerangkan maksud memelihara tanda di bawah). Terdapat satu lagi pengendali syif kanan >>>
. Ia melakukan perkara yang sama tetapi >>
tidak menyimpan tanda. Jadi, mari kita lihat kerja mereka menggunakan contoh. int a = 13
a << 1
mengalihkan semua bit perwakilan binari nombor a ke kiri sebanyak 1 bit. Untuk memudahkan, mari kita bayangkan nombor 13 dalam binari sebagai 0000 1101. Malah, nombor ini kelihatan seperti ini: 00000000 00000000 00000000 00001101, kerana Java int
memperuntukkan 4 bait atau 32 bit untuk nombor. Walau bagaimanapun, ini tidak memainkan peranan dalam contoh, jadi dalam contoh ini kita akan menganggap nombor kita sebagai satu bait. Bit yang dikosongkan di sebelah kanan diisi dengan sifar. Hasil daripada operasi ini, kita mendapat nombor 26. a << 2
Ia mengalihkan semua bit perwakilan binari nombor a
ke kiri sebanyak 2 bit, dan dua bit yang dikosongkan di sebelah kanan diisi dengan sifar. Hasilnya, kita akan mendapat nombor 52. a << 3
Hasilnya ialah 104... Perhatikan coraknya? Peralihan bitwise a
ke kiri dengan n kedudukan berfungsi seperti mendarab nombor a
dengan 2 kepada kuasa n. Perkara yang sama berlaku untuk nombor negatif. Ini -13 << 3
akan memberikan hasil -104. a >> n
mengalihkan perwakilan binari nombor n kedudukan ke kanan. Sebagai contoh, 13 >> 1
Mengubah nombor 1101 kepada nombor 0110, iaitu, 6. Dan 13 >> 2
hasilnya akan menjadi 3. Iaitu, pada dasarnya, di sini kita membahagikan nombor dengan 2 kepada kuasa n, di mana n ialah bilangan anjakan ke kanan, tetapi dengan satu kaveat: jika nombor itu ganjil, semasa operasi ini kami nampaknya menetapkan semula bit terakhir nombor itu. Tetapi dengan yang negatif keadaannya agak berbeza. Katakan, cuba semak perkara yang akan dihasilkan oleh program jika anda memintanya melakukan operasi -13 >> 1
. Anda akan melihat nombor -7, bukan -6, seperti yang anda fikirkan. Ini berlaku kerana cara nombor negatif disimpan dalam Java dan bahasa pengaturcaraan lain. Mereka disimpan dalam apa yang dipanggil kod pelengkap. Dalam kes ini, digit paling ketara (yang di sebelah kiri) diberikan di bawah tanda. Dalam kes nombor negatif, digit paling ketara ialah 1.
Kod tambahan
Mari kita pertimbangkan nomborint a = 13
. Jika dalam atur cara anda mencetak perwakilan binarinya ke konsol menggunakan arahan System.out.println(Integer.toBinaryString(a));
, maka kami akan mendapat 1101. Sebenarnya, ini adalah notasi trengkas, kerana nombor jenis int
mengambil 4 bait dalam memori, jadi komputer "melihat" lebih banyak. seperti ini:
00000000 00000000 00000000 00001101
Digit yang paling ketara ialah sifar, yang bermaksud kita mempunyai nombor positif. Untuk menukar kepada kod tambahan:
-
Kami menulis nombor -13 dalam apa yang dipanggil "kod langsung". Untuk melakukan ini, tukar digit paling ketara nombor kepada 1.
Keputusan tindakan:10000000 0000000 0000000 00001101
-
Seterusnya, kita terbalikkan semua bit (kita tukar 0 kepada 1, dan 1 kepada 0) kecuali bit tanda. Malah, kita telah pun mengubahnya.
Hasil tindakan:11111111 11111111 11111111 11110010
(ya, langkah 1 dan 2 boleh digabungkan, tetapi lebih baik untuk memikirkannya seperti itu)
- Tambahkan 1 pada nombor yang terhasil.
Hasil tindakan:11111111 11111111 11111111 11110011
-13 >> 1
. Oleh kerana pengendali kami >>
mengekalkan tanda itu, dalam operasi ini semua bit yang dibebaskan di sebelah kiri diisi bukan dengan sifar, tetapi dengan satu. Oleh itu, menukar nombor
11111111 11111111 11111111 11110011
satu bit ke kanan, menghasilkan urutan bit berikut:
11111111 11111111 11111111 11111001
Jika kita menukar nombor ini kepada kod langsung (iaitu, mula-mula tolak 1, kemudian terbalikkan semua bit kecuali yang pertama) kita mendapat nombor:
10000000 00000000 00000000 00000111
atau -7. Memandangkan kita telah memahami operator syif kanan yang memelihara tanda, ia akan menjadi jelas bagaimana ia berbeza daripada operator >>>
. a >>> n
— operasi ini ialah anjakan yang tidak ditandatangani, iaitu, ia mengalihkan perwakilan binari nombor a
ke kanan dengan n bit, tetapi mengisi n bit yang dikosongkan di sebelah kiri bukan dengan yang, seperti operator >>
, tetapi dengan sifar. Jom buat operasi -13 >>> 1
. Kami sudah mempunyai nombor -13
dalam pelengkap dua:
11111111 11111111 11111111 11110011
Dengan beralih ke kanan sebanyak 1 bit dan mengisi bit percuma dengan sifar, kita mendapat nombor berikut:
01111111 11111111 11111111 11111001
Apakah yang memberikan nombor dalam tatatanda perpuluhan 2147483641
.
Operator penafian bitwise ~
Operator unary ini berfungsi dengan sangat mudah: ia membalikkan setiap bit perwakilan binari integer. Mari kita ambil nombor-13
:
11111111 11111111 11111111 11110011
Operasi penafian bitwise ~13
hanya akan membalikkan nilai setiap bit. Hasilnya kami mendapat:
00000000 00000000 00000000 00001100
Atau 12
dalam bentuk perpuluhan.
Kesimpulan ringkas
- Semua pengendali logik digunakan pada ungkapan Boolean, iaitu, yang boleh dikatakan benar atau salah .
- Если операторы
&
,|
or^
применяются к числам, речь идёт уже не о логических операциях, а о побитовых. То есть оба числа переводятся в двоичную систему и к этим числам побитово применяют операции логического сложения, умножения or вычитания. - В математической логике операторам
&
и|
соответствуют конъюнкция и дизъюнкция. - Логическое И похоже на умножения 1 (true) и 0 (false).
- Логическое ИЛИ напоминает поиск максимума среди 1 (true) и 0 (false).
- Для побитового отрицания целого числа a используется операция
~a
. - Для логического отрицания булевского выражения a используется операция
!a
. - Отрицательные числа хранятся и обрабатываются в дополнительном codeе.
- Поразрядный сдвиг вправо может сохранять знак (
>>
), а может — не сохранять (>>>
).
GO TO FULL VERSION