JavaRush /Java Blog /Random-TK /Java-da bitwise amallary

Java-da bitwise amallary

Toparda çap edildi
“Urmak” sözi bilen tanyş bolsaňyz gerek. Notok bolsa, geliň muny öwreneliň :) Biraz kompýuterdäki maglumatlary ölçemegiň iň az birligi. Onuň ady iňlis dilindäki “ ikilik san ” - “ikilik san” -dan gelýär. Biraz iki sanyň biri hökmünde aňladylyp bilner: 1 ýa-da 0. Birine we nollara esaslanýan ýörite san ulgamy bar - ikilik. Matematikanyň jeňňelligine girip bilmeris we Java-daky islendik sanyň ikilik görnüşine öwrülip biljekdigini belläliň. Munuň üçin örtük sapaklaryny ulanmaly. Bitwise amallary - 1Mysal üçin, san üçin nädip etmeli int:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(x));
   }
}
Konsol çykyşy:

101010110
1010 10110 (okamak üçin ýer goşdum) ikilikdäki 342 belgidir. Aslynda bu sanlary aýratyn bitlere - nollara we sanlara böldük. Hut olar bilen bitwise diýilýän amallary ýerine ýetirip bileris.
  • ~- birneme “NOTOK” operatory.

Örän ýönekeý işleýär: sanlarymyzyň her bir böleginden geçýär we bahasyny tersine üýtgedýär: nollara, nollara. 342 belgimize ulansak, alýan zadymyz: 101010110 - ikilik 010101001-de 342 belgisi - 2 342 aňlatmanyň netijesi, ýöne int üýtgeýjisi 4 baýt alýar, ýagny. Aslynda 32 bit, üýtgeýjidäki san aşakdaky ýaly saklanýar: 00000000 00000000 00000001 01010110- java int görnüşiniň üýtgeýjisindäki 342 san 11111111 11111111 11111110 10101001- java ~ 342 aňlatmanyň netijesi Geliň muny iş ýüzünde etmäge synanyşalyň:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(~x));
   }
}
Konsol çykyşy:
11111111111111111111111010101001
  • &- “AND” görnüşli operator

Görşüňiz ýaly, logiki “AND” () bilen gaty meňzeýär &&. Operator &&, ýadyňyzda bolsa, truediňe iki operasiýa dogry bolsa gaýdyp gelýär. Bitwise &şuňa meňzeş görnüşde işleýär: iki sany sanlary birneme deňeşdirýär. Bu deňeşdirmäniň netijesi üçünji san. Mysal üçin, 277 we 432: 100010101 sanlary - ikilik görnüşindäki 277 belgini 110110000 - ikilik görnüşindäki 432 belgisini alalyň Indiki, operator ýokarky belginiň &birinji bölegini aşaky belginiň birinji biti bilen deňeşdirýär. Bu "AND" operatory bolansoň, netije diňe iki bit 1-e deň bolsa 1-e deň bolar. Beýleki ähli ýagdaýlarda netije 0. 100010101 110110000 _______________ 100010000 bolar & - işiň netijesi & Ilki bilen ilkinji bitleri deňeşdirýäris biri-biri bilen iki san, soň ikinji bit, üçünji we ş.m. Görşüňiz ýaly, diňe iki ýagdaýda ikisi hem 1-e deň bolan sanlarda (birinji we bäşinji bit). Beýleki deňeşdirmeleriň netijesi 0 boldy. Şonuň üçin ahyrynda 100010000 belgini aldyk. Onluk ulgamda 272 belgä gabat gelýär. Barlap göreliň:
public class Main {

   public static void main(String[] args) {
       System.out.println(277&432);
   }
}
Konsol çykyşy:

272
  • |- birneme “OR”. Işleýiş ýörelgesi birmeňzeş - iki sany sanlary az-kem deňeşdirýäris. Diňe indi bitleriň azyndan biri 1-e deň bolsa, netije 1-e deň bolar. Geliň, şol bir sanlara seredeliň - 277 we 432:
100010101 | 110110000 _______________ 110110101 - işiň netijesi. | Bu ýerde netije başga: diňe iki belgide nol bolan bitler nol bolup galdy. Işiň netijesi 110110101 belgidir. Onluk ulgamda 437 belgä gabat gelýär. Geliň barlap göreliň:
public class Main {

   public static void main(String[] args) {
       System.out.println(277|432);
   }
}
Konsol çykyşy:

437
Biz hemme zady dogry hasapladyk! :)
  • ^- birneme eksklýuziw OR (XOR hem diýilýär)
Munuň ýaly operatory öň görmedik. Emma bu barada çylşyrymly zat ýok. Adaty “ýa-da” ýaly görünýär. Tapawut bir: trueiň bolmanda bir operand dogry bolsa adaty “ýa-da” gaýdyp gelýär. Emma hökmany suratda biri däl - ikisi hem bar bolsa true- netijesi true. Excöne aýratyn “ýa-da” truediňe operandlaryň biri dogry bolsa gaýdyp gelýär. Iki operanyňam dogry bolsa, yzygiderli “ýa-da” gaýdyp geler true(“iň bolmanda biri dogry”), ýöne eksklýuziw ýa-da gaýdyp geler false. Şonuň üçin oňa eksklýuziw diýilýär. Öňki bitwise amallarynyň ýörelgesini bilip, 277 ^ 432 amalyny aňsatlyk bilen ýerine ýetirip bilersiňiz. Itöne geliň, ýene bir gezek bileliň :) 100010101 ^ 110110000 _______________ 010100101 - işiň netijesi ^ Ine, biziň netijämiz. Iki san boýunça birmeňzeş bolan bitler 0 gaýdyp geldi (“biri” formulasy işlemedi). Emma 0-1 ýa-da 1-0 jübüti emele getirenler ahyrsoňy birlige öwrüldi. Netijede, 010100101 belgisini aldyk. Onluk ulgamda ol 165 belgä gabat gelýär. Dogry hasaplandygymyzy göreliň:
public class Main {

   public static void main(String[] args) {
       System.out.println(277^432);
   }
}
Konsol çykyşy:

165
Super! Hemme zat edil pikir edişimiz ýaly :) Indi bit smenasy diýilýän amallar bilen tanyşmagyň wagty geldi. Ady, esasan, özi üçin gürleýär. Biraz san alarys we bitlerini çepe we saga geçireris :) Geliň nähili bolýandygyny göreliň:

Çep

Bitleriň çep çalşygy Mysal bilen görkezilýär << :
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));
   }
}
Bu mysalda sana x=64baha diýilýär. Biziň bitlerimiz. Bitleri çepe öwüreris (muny alamatyň ugry bilen kesgitläp bolýar <<) Ikilik ulgamynda 64 = 1000000 y=3belgä san diýilýär. Mukdar “sanyň bitleri sag / çepe näçe bit üýtgedilmeli x?” Diýen soraga jogap berýär. Mysal üçin, olary 3 bit çepe geçireris. Çalyşma prosesini has düşnükli etmek üçin, surata seredeliň. Mysalymyzda int görnüşiniň sanlaryny ulanýarys. Int32 bit kompýuter ýadyny eýeleýär. Asyl belgimiz 64-e meňzeýär: Bitwise amallary - 2Indi bolsa sözüň göni manysynda her bitimizi alyp, 3 öýjük tarapyndan çepe geçirýäris: Bitwise amallary - 3Bu aldyk. Görşüňiz ýaly, ähli bitlerimiz üýtgedi we çäkden daşarda ýene 3 nol goşuldy. 3 - sebäbi 3-e çalyşýandygymyz üçin 10-a çalyşýan bolsak, 10 nol goşular. Şeýlelik bilen aňlatma x << y“y sanly öýjükleriň bitlerini хçepe geçirmek” diýmekdir. Biziň aňlatmamyzyň netijesi, onluk ulgamda 512-e deň bolan 1000000000 sany boldy. Geliň barlap göreliň:
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);
   }
}
Konsol çykyşy:

512
Dogry! Teoriýa boýunça bitler belli bir möhletde üýtgedilip bilner. Emma bizde san barlygy sebäpli intdiňe 32 öýjük bar. Bulardan 7-si eýýäm 64 (1 000 000) sanyny eýeleýär. Şonuň üçin, meselem, çepe 27 smena etsek, ýeke-täk bölümimiz çäkden çykar we “täzeden ýazar”. Diňe nollar galar!
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);
   }
}
Konsol çykyşy:

0
Garaşylyşy ýaly, biri 32 bit öýjükden geçdi we ýitdi. Diňe noldan ybarat 32 bitli san aldyk. Bitwise amallary - 4Elbetde, onluk ulgamda 0-a gabat gelýär. Çep smenalary ýatda saklamagyň ýönekeý düzgüni: Her çep smena bilen san 2-e köpelýär. Mysal üçin, geliň, aňlatmanyň netijesini bitsiz suratlar bilen hasaplamaga synanyşalyň. Bize 111111111 << 3 zerur 111111111 belgisini 2 gezek üç esse köpeltmek. Netijede 888888888 alarys. Kody ýazalyň we barlap göreliň:
public class Main {

   public static void main(String[] args) {
       System.out.println(111111111 << 3);
   }
}
Konsol çykyşy:

888888888

Sag smena

Bu belgi bilen görkezilýär >>. Edil şol bir zady edýärler, diňe başga tarapa! :) Geliň, tekeri täzeden dikeltmäliň we muny int 64 belgisi bilen etmäge synanyşalyň.
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);
   }
}
Bitwise amallary - 5Bitwise amallary - 62-den saga geçmegi netijesinde, nomerimiziň iki sany nol aralygyndan çykdy we pozuldy. Onluk ulgamda 16-a gabat gelýän 10000 belgini aldyk, konsola çykyş:

16
Sag smenalary ýatda saklamagyň ýönekeý düzgüni: Her sag smena galanlary taşlap, ikä bölünýär. Mysal üçin, galanlaryny taşlap (galan 1-i taşlamak) (galanlary taşlamak 1) Jemi 8-e deň bolmaly 35 >> 2 diýmek, 35-den 2-ä iki gezek bölmeli .35/2 = 1717:2 = 835 >> 2
public class Main {

   public static void main(String[] args) {
       System.out.println(35 >> 2);
   }
}
Konsol çykyşy:

8

Java-da amallaryň ähmiýeti

Kod ýazanyňyzda ýa-da okanyňyzda, köplenç bir wagtyň özünde birnäçe amal ýerine ýetirilýän sözlere duşarsyňyz. Olaryň haýsy tertipde ýerine ýetiriljekdigine düşünmek gaty möhümdir, ýogsam netije garaşylmadyk bolup biler. Java-da köp amallar bolansoň, hemmesi ýörite tablisa bölündi:

Operatoryň ähmiýeti

Operatorlar Üstünlik
postfiks expr++ expr--
unary ++expr --expr +expr ~ !
Köpeltmek * / %
goşundy + -
çalşyk << >> >>>
baglanyşyk < > <= >=mysal
deňlik == !=
tersine we &
birneme eksklýuziw OR ^
birneme öz içine alýan OR |
logiki we &&
logiki OR ||
üçünji ? :
ýumuş = += -= *= /= %= &= ^= |= <<= >>= >>>=
Operationshli amallar çepden saga ýerine ýetirilýär, ýöne ileri tutulýan ugurlaryny göz öňünde tutýar. Mysal üçin, ýazsak: int x = 6 - 4/2; ilki bilen bölüniş operasiýasy (4/2) ýerine ýetiriler. Ikinji hatarda bolsa-da, has ileri tutýar. Gaplaňlar ýa-da inedördül ýaýlar islendik ileri tutulýan zady maksimum üýtgedýärler. Muny mekdepden ýadyňyzda bolsa gerek. Mysal üçin, olary aňlatma goşsaňyz: int x = (6 - 4)/2; aýyrmak ilki bilen ýerine ýetiriler, sebäbi ol gabygyň içinde hasaplanýar. Logiki operatoryň &&tablisadan görnüşi ýaly gaty pes ähmiýeti bar. Şonuň üçin köplenç iň soňky gezek ýerine ýetiriler. Mysal üçin: boolean x = 6 - 4/2 > 3 && 12*12 <= 119; Bu aňlatma şeýle ýerine ýetiriler:
  • 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;
  • Ondan soň deňeşdirme operatorlary ýerine ýetiriler:

    4 > 3 = true

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

    boolean x = true && false;
  • Iň soňunda bolsa iň soňky operator ýerine ýetiriler &&.

    boolean x = true && false;

    boolean x = false;

    Mysal üçin, goşma operatory ( +) deňeşdirme operatoryndan has ýokary ähmiýete eýe !=(“deň däl”);

    Şonuň üçin aňlatmada:

    boolean x = 7 != 6+1;

    ilki bilen 6 + 1 operasiýasy ýerine ýetiriler, soň bolsa 7! = 7 (ýalan) barlag geçiriler we ahyrynda netije üýtgeýjä falseberler x. Bellenme, adatça, ähli amallaryň iň pes ähmiýeti bar - tablisa serediň.

Phew! Leksiýamyz uzyn boldy, ýöne etdiňiz! Munuň käbir bölümlerine we öňki leksiýalara doly düşünmeseňiz, alada etmäň, geljekde bu mowzuklara birnäçe gezek degip geçeris. Ine, size peýdaly baglanyşyklar:
  • Logiki operatorlar - Logiki amallar barada JavaRush leksiýasy. Soonakyn wagtda olara baryp bilmeris, ýöne indi okap bilersiňiz, zyýany bolmaz
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION