JavaRush /Blog Jawa /Random-JV /Operasi bitwise ing Jawa

Operasi bitwise ing Jawa

Diterbitake ing grup
Sampeyan mbokmenawa menowo karo tembung "ngalahake". Yen ora, ayo padha ngerti :) A bit minangka unit pangukuran minimal informasi ing komputer. Jeneng kasebut asale saka basa Inggris " digit biner " - "nomer biner". A dicokot bisa ditulis minangka salah siji saka rong nomer: 1 utawa 0. Ana sistem nomer khusus adhedhasar siji lan nul - binar. Kita ora bakal nyelidiki alas matematika lan mung elinga yen angka apa wae ing Jawa bisa diowahi dadi bentuk binar. Kanggo nindakake iki, sampeyan kudu nggunakake kelas pambungkus. Operasi bitwise - 1Contone, iki carane nindakake kanggo nomer int:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(x));
   }
}
Output konsol:

101010110
1010 10110 (Aku nambah spasi kanggo maca) yaiku angka 342 ing binar. Kita bener dibagi nomer iki dadi bit individu - nul lan siji. Iku karo wong-wong mau kita bisa nindakake operasi disebut bitwise.
  • ~- bitwise "NOT" operator.

Kerjane banget prasaja: iku liwat saben dicokot saka nomer kita lan ngganti Nilai kanggo ngelawan: nul kanggo siji, siji kanggo nul. Yen kita aplikasi menyang nomer kita 342, iki apa kita njaluk: 101010110 iku nomer 342 ing binar 010101001 minangka asil saka expression ~ 342 Nanging wiwit variabel int njupuk 4 bita, i.e. 32 bit, nyatane, angka ing variabel disimpen minangka: 00000000 00000000 00000001 01010110- angka 342 ing variabel tipe int ing java 11111111 11111111 11111110 10101001- asil saka ekspresi ~342 ing java Ayo nyoba nindakake iki ing praktik:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(~x));
   }
}
Output konsol:
11111111111111111111111010101001
  • &- operator bitwise "AND"

Nalika sampeyan bisa ndeleng, ditulis meh padha karo logis "AND" ( &&). Operator &&, kaya sing sampeyan eling, truemung bali yen loro operan kasebut bener. Bitwise &dianggo kanthi cara sing padha: mbandhingake rong angka kanthi dicokot. Asil saka comparison iki nomer katelu. Contone, ayo njupuk angka 277 lan 432: 100010101 - angka 277 ing wangun binar 110110000 - angka 432 ing wangun binar Sabanjure, operator &mbandhingake bit pisanan saka nomer ndhuwur karo bit pisanan saka ngisor. Amarga iki minangka operator "AND", asil bakal padha karo 1 mung yen loro bit padha karo 1. Ing kabeh kasus liyane, asil bakal dadi 0. 100010101 & 110110000 _______________ 100010000 - asil karya & Kita mbandhingake bit pisanan. saka rong nomer karo saben liyane, banjur bit kapindho, katelu, etc. Nalika sampeyan bisa ndeleng, mung ing rong kasus padha loro bit ing nomer padha karo 1 (bit pisanan lan kaping lima). Asil saka kabeh perbandingan liyane ana 0. Mulane, ing pungkasan kita entuk nomer 100010000. Ing sistem desimal, cocog karo nomer 272. Ayo priksa:
public class Main {

   public static void main(String[] args) {
       System.out.println(277&432);
   }
}
Output konsol:

272
  • |- bitwise "UTAWA". Prinsip operasi padha - kita mbandhingake rong nomer kanthi dicokot. Mung saiki yen paling sethithik siji bit padha karo 1, asil bakal padha karo 1. Ayo padha ndeleng nomer sing padha - 277 lan 432:
100010101 | 110110000 _______________ 110110101 - asil karya | ing kene asil beda: mung bit sing nul ing nomer loro tetep nul. Asil karya yaiku nomer 110110101. Ing sistem desimal cocog karo nomer 437. Ayo priksa:
public class Main {

   public static void main(String[] args) {
       System.out.println(277|432);
   }
}
Output konsol:

437
Kita ngetung kabeh kanthi bener! :)
  • ^- bitwise eksklusif OR (uga dikenal minangka XOR)
Kita durung nate nemoni operator kaya ngono. Nanging ora ana sing rumit. Iku katon kaya biasa "utawa". Bentenipun siji: biasa "utawa" bali trueyen paling siji operand bener. Nanging ora kudu siji - yen loro-lorone ana true- banjur asil true. Nanging "utawa" eksklusif truemung bali yen salah siji saka operand bener. Yen loro operan bener, "utawa" biasa bakal bali true("paling ora siji bener"), nanging eksklusif utawa bakal bali false. Mulane diarani eksklusif. Ngerti prinsip operasi bitwise sadurunge, sampeyan bisa uga gampang nindakake operasi 277 ^ 432 dhewe. Nanging ayo dipikirake bebarengan maneh :) 100010101 ^ 110110000 _______________ 010100101 - asil karya ^ Punika asil kita. Bit sing padha ing nomer loro bali 0 (rumus "siji saka" ora bisa). Nanging sing nggawe pasangan 0-1 utawa 1-0 pungkasane dadi unit. Akibaté, kita entuk nomer 010100101. Ing sistem desimal, iku cocog karo nomer 165. Ayo ndeleng yen kita ngetung kanthi bener:
public class Main {

   public static void main(String[] args) {
       System.out.println(277^432);
   }
}
Output konsol:

165
Super! Kabeh persis kaya sing kita pikirake :) Saiki iki wektu kanggo kenal karo operasi sing diarani shift bit. Jeneng, ing asas, ngandika kanggo dhewe. Kita bakal njupuk sawetara nomer lan mindhah bit ngiwa lan nengen :) Ayo ndeleng kaya apa:

Ngalih ngiwa

Pergeseran bit kiwa dituduhake kanthi tandha << Conto:
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 3;//quantity

       int z = (x << y);
       System.out.println(Integer.toBinaryString(x));
       System.out.println(Integer.toBinaryString(z));
   }
}
Ing conto iki, angka kasebut x=64diarani nilai. Iku bit sing bakal kita ganti. Kita bakal mindhah bit menyang kiwa (iki bisa ditemtokake kanthi arah tandha <<) Ing sistem biner, angka 64 = 1000000 Nomer kasebut y=3diarani kuantitas. Quantity njawab pitakonan "pinten bit ing sisih tengen / kiwa kudu bit saka nomer dipindhah x?" Ing conto kita, kita bakal mindhah 3 bit menyang ngiwa. Kanggo nggawe proses shift luwih jelas, ayo deleng gambar kasebut. Ing conto kita nggunakake nomer jinis int. Int's Occupy 32 bit memori komputer. Iki nomer asli kita 64 katon kaya: Operasi bitwise - 2Lan saiki kita, ing pangertèn harfiah saka tembung, njupuk saben bit kita lan ngalih menyang kiwa dening 3 sel: Operasi bitwise - 3Iki apa kita tak. Nalika sampeyan bisa ndeleng, kabeh bit kita wis pindah, lan 3 liyane nul wis ditambahake saka njaba kisaran. 3 - amarga kita padha shifting dening 3. Yen kita padha shifting dening 10, 10 nul bakal ditambahake. Dadi ekspresi kasebut x << ytegese "nggeser bit saka хsel nomer y menyang ngiwa." Asil ekspresi kita yaiku nomer 1000000000, sing ing sistem desimal padha karo 512. Ayo priksa:
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 3;//quantity

       int z = (x << y);
       System.out.println(z);
   }
}
Output konsol:

512
Bener! Ing teori, bit bisa dipindhah tanpa wates. Nanging amarga kita duwe nomer kasebut int, mung ana 32 sel sing kasedhiya. Saka jumlah kasebut, 7 wis dikuwasani kanthi nomer 64 (1.000.000). Mulane, yen kita nggawe, contone, 27 shift ngiwa, mung unit kita bakal metu saka sawetara lan "nimpa". Mung nol bakal tetep!
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 26;//quantity

       int z = (x << y);
       System.out.println(z);
   }
}
Output konsol:

0
Kaya sing dikarepake, sing ngluwihi sel 32 bit lan ilang. Kita entuk nomer 32-bit sing mung nol. Operasi bitwise - 4Alami, ing sistem desimal cocog karo 0. Aturan prasaja kanggo ngelingi shift kiwa: Kanthi saben shift kiwa, nomer kasebut dikalikan karo 2. Contone, ayo nyoba ngetung asil ekspresi tanpa gambar kanthi bit 111111111 << 3 . kanggo multiply nomer 111111111 dening 2 kaping telu. Akibaté, kita njaluk 888888888. Ayo nulis kode lan mriksa:
public class Main {

   public static void main(String[] args) {
       System.out.println(111111111 << 3);
   }
}
Output konsol:

888888888

Ngalih tengen

Padha dituduhake dening tandha >>. Padha nindakake bab sing padha, mung ing arah liyane! :) Ayo ora reinvent setir lan nyoba kanggo nindakake iki karo nomer padha int 64.
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 2;//quantity

       int z = (x >> y);
       System.out.println(z);
   }
}
Operasi bitwise - 5Operasi bitwise - 6Minangka asil saka shift dening 2 menyang tengen, loro nul nemen nomer kita metu saka sawetara lan dibusak. Kita entuk nomer 10000, sing ing sistem desimal cocog karo nomer 16. Output menyang konsol:

16
A aturan prasaja kanggo ngelingi shift tengen: Saben shift tengen dibagi loro, discarding sisa. Contone, 35 >> 2 iku tegese kita kudu dibagi 35 dening 2 2 kaping, discarding sisa 35/2 = 17(discarding sisa 1) 17:2 = 8(discarding sisa 1) Total 35 >> 2kudu padha karo 8. Priksa:
public class Main {

   public static void main(String[] args) {
       System.out.println(35 >> 2);
   }
}
Output konsol:

8

Precedence saka operasi ing Jawa

Nalika sampeyan nulis utawa maca kode, sampeyan bakal kerep nemokake ekspresi ing ngendi sawetara operasi ditindakake bebarengan. Penting banget kanggo ngerti urutan apa sing bakal ditindakake, yen ora, asil bisa uga ora dikarepake. Amarga ana akeh operasi ing Jawa, kabeh padha dipisahake dadi tabel khusus:

Operator Precedence

Operator kautamaan
postfix expr++ expr--
unary ++expr --expr +expr ~ !
Multiplicative * / %
aditif + -
ngalih << >> >>>
relasional < > <= >=contone
Podo == !=
bitwise AND &
bitwise eksklusif UTAWA ^
bitwise klebu UTAWA |
logika AND &&
logis UTAWA ||
terner ? :
tugas = += -= *= /= %= &= ^= |= <<= >>= >>>=
Kabeh operasi ditindakake saka kiwa menyang tengen, nanging njupuk prioritas. Contone, yen kita nulis: int x = 6 - 4/2; pisanan operasi divisi (4/2) bakal ditindakake. Sanajan dheweke nomer loro, dheweke duwe prioritas sing luwih dhuwur. Kurung utawa kurung kothak ngganti prioritas kanggo maksimum. Sampeyan mbokmenawa ngelingi iki saka sekolah. Contone, yen sampeyan nambahake menyang ekspresi: int x = (6 - 4)/2; pangurangan bakal ditindakake dhisik, amarga diwilang ing kurung. Operator logis nduweni &&prioritas sing rada kurang, kaya sing bisa dideleng saka tabel. Mulane, paling asring bakal dieksekusi pungkasan. Contone: boolean x = 6 - 4/2 > 3 && 12*12 <= 119; Ekspresi iki bakal dieksekusi kaya iki:
  • 4/2 = 2

    boolean x = 6 - 2 > 3 && 12*12 <= 119;
  • 12*12 = 144

    boolean x = 6 - 2 > 3 && 144 <= 119;
  • 6-2 = 4

    boolean x = 4 > 3 && 144 <= 119;
  • Sabanjure operator perbandingan bakal dieksekusi:

    4 > 3 = true

    boolean x = true && 144 <= 119;
  • 144 <= 119 = false

    boolean x = true && false;
  • Lan pungkasane, operator pungkasan bakal dieksekusi &&.

    boolean x = true && false;

    boolean x = false;

    Operator tambahan ( +), contone, wis precedence luwih saka operator comparison !=("ora padha");

    Mulane ing ekspresi:

    boolean x = 7 != 6+1;

    pisanan operasi 6 + 1 bakal dileksanakake, banjur mriksa 7! = 7 (palsu), lan ing pungkasan asil bakal diutus kanggo falsevariabel x. Assignment umume nduweni prioritas paling murah ing kabeh operasi - katon ing tabel.

Phew! Kuliah kita dawa, nanging sampeyan nindakake! Yen sampeyan ora ngerti sawetara bagean iki lan ceramah sadurunge, aja kuwatir, kita bakal ndemek topik kasebut luwih saka sepisan ing mangsa ngarep. Ing ngisor iki sawetara pranala sing migunani kanggo sampeyan:
  • Operator Logika - JavaRush kuliah babagan operasi logis. Kita ora bakal entuk wektu enggal, nanging sampeyan bisa maca saiki, ora bakal ana gawe piala
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION