JavaRush /Java blogi /Random-UZ /Java-da bitli operatsiyalar

Java-da bitli operatsiyalar

Guruhda nashr etilgan
Ehtimol, siz "kaltaklash" so'zini yaxshi bilasiz. Agar yo'q bo'lsa, keling, uni bilib olaylik :) Bit - kompyuterdagi ma'lumotlarning minimal o'lchov birligi. Uning nomi inglizcha " binary digit " - "ikkilik raqam" dan olingan. Bit ikkita raqamdan biri sifatida ifodalanishi mumkin: 1 yoki 0. Birliklar va nolga asoslangan maxsus sanoq tizimi mavjud - ikkilik. Biz matematika o'rmoniga kirmaymiz va shuni ta'kidlaymizki, Java-dagi har qanday raqam uning ikkilik shakliga o'zgartirilishi mumkin. Buning uchun siz o'rash sinflaridan foydalanishingiz kerak. Bitli operatsiyalar - 1Masalan, raqam uchun buni qanday qilish kerak int:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(x));
   }
}
Konsol chiqishi:

101010110
1010 10110 (men o'qish uchun bo'sh joy qo'shdim) ikkilik tizimda 342 raqami. Biz aslida bu raqamni alohida bitlarga - nol va birlarga ajratdik. Aynan ular bilan biz bitli deb ataladigan operatsiyalarni bajarishimiz mumkin.
  • ~— bit yoʻnalishi boʻyicha “NOT” operatori.

Bu juda oddiy ishlaydi: u bizning raqamimizning har bir bitidan o'tadi va uning qiymatini teskarisiga o'zgartiradi: nollarni birlarga, birlarni nolga aylantiradi. Agar biz uni 342 raqamimizga qo'llasak, biz shunday bo'lamiz: 101010110 - ikkilikdagi 342 raqami 010101001 - ~342 ifodasining natijasi Lekin int o'zgaruvchisi 4 baytni olgani uchun, ya'ni. 32 bit, aslida o'zgaruvchidagi raqam quyidagicha saqlanadi: 00000000 00000000 00000001 01010110- java'da int tipidagi o'zgaruvchidagi 342 raqami 11111111 11111111 11111110 10101001- java'da ~342 ifoda natijasi Keling, buni amalda bajarishga harakat qilaylik:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(~x));
   }
}
Konsol chiqishi:
11111111111111111111111010101001
  • &- bitli operator "AND"

Ko'rib turganingizdek, u mantiqiy "VA" ( &&) ga juda o'xshash yozilgan. Operator &&, eslaganingizdek, trueikkala operand ham to'g'ri bo'lsagina qaytariladi. Bitwise shunga &o'xshash tarzda ishlaydi: u ikkita raqamni bitma-bosqich taqqoslaydi. Ushbu taqqoslash natijasi uchinchi raqamdir. Masalan, 277 va 432 raqamlarini olaylik: 100010101 - ikkilik shakldagi 277 raqami 110110000 - ikkilik shakldagi 432 raqami Keyinchalik operator &yuqori sonning birinchi bitini pastki sonning birinchi biti bilan taqqoslaydi. Bu "VA" operatori bo'lgani uchun, ikkala bit ham 1 ga teng bo'lsagina natija 1 ga teng bo'ladi. Boshqa barcha holatlarda natija 0 bo'ladi. 100010101 & 110110000 _______________ 100010000 - ish natijasi & Biz birinchi navbatda birinchi bitlarni solishtiramiz. bir-biri bilan ikkita raqam, keyin ikkinchi bit, uchinchi va hokazo. Ko'rib turganingizdek, faqat ikkita holatda raqamlardagi ikkala bit ham 1 ga teng edi (birinchi va beshinchi bitlar). Boshqa barcha taqqoslashlar natijasi 0 ga teng bo'ldi. Shunday qilib, yakunda biz 100010000 raqamini oldik. O'nli kasr tizimida u 272 raqamiga to'g'ri keladi. Keling, tekshiramiz:
public class Main {

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

272
  • |- bit bo'yicha "YOKI". Amaliyot printsipi bir xil - biz ikkita raqamni asta-sekin solishtiramiz. Faqat endi, agar bitlardan kamida bittasi 1 ga teng bo'lsa, natija 1 ga teng bo'ladi. Keling, bir xil raqamlarni ko'rib chiqaylik - 277 va 432:
100010101 | 110110000 _______________ 110110101 - ish natijasi | Bu erda natija boshqacha: faqat ikkala raqamda nol bo'lgan bitlar nol bo'lib qoldi. Ish natijasi 110110101 raqamidir. O'nli kasr tizimida u 437 raqamiga to'g'ri keladi. Keling, tekshiramiz:
public class Main {

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

437
Biz hamma narsani to'g'ri hisobladik! :)
  • ^- bit bo'yicha eksklyuziv OR (shuningdek, XOR sifatida ham tanilgan)
Biz ilgari hech qachon bunday operatorni uchratmaganmiz. Ammo bu erda hech qanday murakkab narsa yo'q. Bu odatiy "yoki" kabi ko'rinadi. Farqi bitta: trueagar kamida bitta operand to'g'ri bo'lsa, oddiy "yoki" qaytariladi. Lekin bittasi shart emas - agar ikkalasi ham mavjud bo'lsa true- natija true. Ammo eksklyuziv "yoki" truefaqat operandlardan biri to'g'ri bo'lsa, qaytariladi. Agar ikkala operand ham rost boʻlsa, oddiy “yoki” qaytariladi true(“kamida bittasi toʻgʻri”), lekin eksklyuziv yoki qaytariladi false. Shuning uchun u eksklyuziv deb ataladi. Oldingi bitli operatsiyalar printsipini bilib, siz 277^432 operatsiyasini o'zingiz osongina bajarishingiz mumkin. Ammo keling, buni yana bir bor birgalikda aniqlaylik :) 100010101 ^ 110110000 _______________ 010100101 - ish natijasi ^ Mana bizning natijamiz. Ikkala raqamda ham bir xil bo'lgan bitlar 0 ni qaytardi ("bir" formula ishlamadi). Ammo 0-1 yoki 1-0 juftligini tashkil qilganlar oxir-oqibat bir birlikka aylandi. Natijada, biz 010100101 raqamini oldik. O'nli kasr tizimida u 165 raqamiga to'g'ri keladi. Keling, to'g'ri hisoblanganimizni ko'rib chiqaylik:
public class Main {

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

165
Super! Hammasi biz o'ylagandek bo'ldi :) Endi bit siljishi deb ataladigan operatsiyalar bilan tanishish vaqti keldi. Ism, printsipial jihatdan, o'zi uchun gapiradi. Biz bir nechta raqamni olamiz va uning bitlarini chapga va o'ngga siljitamiz :) Keling, qanday ko'rinishini ko'rib chiqamiz:

Chapga siljitish

Bitlarning chapga siljishi belgisi bilan ko'rsatilgan << Misol:
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));
   }
}
Ushbu misolda raqam x=64qiymat deb ataladi. Biz uning qismlarini almashtiramiz. Bitlarni chapga siljitamiz (bu belgining yo'nalishi bo'yicha aniqlanishi mumkin <<) Ikkilik tizimda raqam 64 = 1000000 Raqam y=3miqdori deyiladi. Miqdor “sonning bitlarini necha bit o‘ngga/chapga siljitish kerak x?” degan savolga javob beradi. Bizning misolimizda biz ularni 3 bit chapga siljitamiz. Shift jarayonini aniqroq qilish uchun rasmga qaraylik. Bizning misolimizda biz int tipidagi raqamlardan foydalanamiz. Intkompyuter xotirasining 32 bitini egallaydi. Bizning asl 64 raqamimiz shunday ko'rinadi: Bitli operatsiyalar - 2Va endi biz so'zning tom ma'noda har bir bitimizni olib, uni 3 katakchaga chapga siljitamiz: Bitli operatsiyalar - 3Bizda shunday bo'ldi. Ko'rib turganingizdek, bizning barcha bitlarimiz o'zgargan va diapazondan tashqaridan yana 3 ta nol qo'shilgan. 3 - chunki biz 3 ga siljigan edik. Agar biz 10 ga siljigan bo'lsak, 10 nol qo'shiladi. Shunday qilib, ibora x << y"y sonining bitlarini хchapga siljitish" degan ma'noni anglatadi. Bizning ifodamiz natijasi 1000000000 soni bo'lib, o'nlik sistemada 512 ga teng. Keling, tekshiramiz:
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 chiqishi:

512
Hammasi to'g'ri! Nazariy jihatdan, bitlarni cheksiz ravishda siljitish mumkin. Ammo bizda raqam borligi sababli int, faqat 32 ta hujayra mavjud. Ulardan 7 tasi allaqachon 64 (1 000 000) raqami bilan band. Shuning uchun, masalan, chapga 27 ta siljish qilsak, bizning yagona birligimiz diapazondan chiqib ketadi va "qayta yozadi". Faqat nollar qoladi!
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 chiqishi:

0
Biz kutganimizdek, bittasi 32 bitli hujayralardan tashqariga chiqdi va g'oyib bo'ldi. Biz faqat nollardan iborat 32 bitli raqamni oldik. Bitli operatsiyalar - 4Tabiiyki, o'nlik sanoq sistemasida u 0 ga to'g'ri keladi.Chapga siljishlarni eslab qolishning oddiy qoidasi: Har bir chap siljishda raqam 2 ga ko'paytiriladi.Masalan, tasvirsiz ifoda natijasini bit bilan hisoblashga harakat qilaylik 111111111 << 3 . 111111111 sonini 2 ga uch marta ko'paytiramiz.Natijada 888888888 hosil bo'ladi.Kodni yozamiz va tekshiramiz:
public class Main {

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

888888888

O'ng siljishlar

Ular belgi bilan ko'rsatilgan >>. Ular xuddi shunday qilishadi, faqat boshqa yo'nalishda! :) Keling, g'ildirakni qayta ixtiro qilmaylik va buni bir xil int 64 raqami bilan qilishga harakat qilaylik.
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);
   }
}
Bitli operatsiyalar - 5Bitli operatsiyalar - 62 ga o'ngga siljish natijasida raqamimizning ikkita ekstremal nollari diapazondan tashqariga chiqdi va o'chirildi. Biz 10000 raqamini oldik, bu o'nlik tizimda 16 raqamiga to'g'ri keladi. Konsolga chiqish:

16
O'ngga siljishlarni eslab qolishning oddiy qoidasi: har bir o'ngga siljish ikkiga bo'linadi va qolgan qolganlarni tashlab yuboradi. Masalan, 35 >> 2 bu 35 ni 2 ga 2 marta bo'lish kerakligini bildiradi, qolganini tashlab 35/2 = 17(1 qoldiqni tashlab) 17:2 = 8(1 qoldiqni tashlab) Jami 35 >> 28 ga teng bo'lishi kerak. Tekshirish:
public class Main {

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

8

Java tilidagi amallarning ustuvorligi

Kodni yozish yoki o'qish jarayonida siz ko'pincha bir vaqtning o'zida bir nechta operatsiyalar bajariladigan iboralarga duch kelasiz. Ular qanday tartibda bajarilishini tushunish juda muhim, aks holda natija kutilmagan bo'lishi mumkin. Java-da ko'plab operatsiyalar mavjud bo'lganligi sababli, ularning barchasi maxsus jadvalga ajratilgan:

Operator ustunligi

Operatorlar Ustunlik
postfiks expr++ expr--
unary ++expr --expr +expr ~ !
Multiplikativ * / %
qo'shimcha + -
siljish << >> >>>
aloqador < > <= >=misol
tenglik == !=
bit bo'yicha VA &
bit bo'yicha eksklyuziv OR ^
bitli inklyuziv OR |
mantiqiy VA &&
mantiqiy OR ||
uchlik ? :
topshiriq = += -= *= /= %= &= ^= |= <<= >>= >>>=
Barcha operatsiyalar chapdan o'ngga, lekin ularning ustuvorligini hisobga olgan holda amalga oshiriladi. Masalan, yozsak: int x = 6 - 4/2; birinchi navbatda bo'lish amali (4/2) bajariladi. Garchi u ikkinchi o'rinda bo'lsa-da, u ustunlikka ega. Qavslar yoki kvadrat qavslar har qanday ustuvorlikni maksimalga o'zgartiradi. Ehtimol, buni maktabda eslaysiz. Misol uchun, agar siz ularni ifodaga qo'shsangiz: int x = (6 - 4)/2; ayirish birinchi navbatda amalga oshiriladi, chunki u qavs ichida hisoblanadi. &&Jadvaldan ko'rinib turibdiki, mantiqiy operator ancha past ustuvorlikka ega . Shuning uchun, ko'pincha u oxirgi marta bajariladi. Masalan: boolean x = 6 - 4/2 > 3 && 12*12 <= 119; Bu ifoda quyidagicha bajariladi:
  • 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;
  • Keyinchalik taqqoslash operatorlari bajariladi:

    4 > 3 = true

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

    boolean x = true && false;
  • Va nihoyat, oxirgi operator bajariladi &&.

    boolean x = true && false;

    boolean x = false;

    Qo'shish operatori ( +), masalan, taqqoslash operatoriga qaraganda yuqoriroq ustunlikka ega !=("teng emas");

    Shuning uchun ifodada:

    boolean x = 7 != 6+1;

    avval 6+1 operatsiyasi bajariladi, so'ngra 7!=7 (noto'g'ri) tekshiruvi bajariladi va oxirida natija o'zgaruvchiga falsetayinlanadi x. Topshiriq, odatda, barcha operatsiyalarning eng past ustuvorligiga ega - jadvalga qarang.

Voy! Bizning ma'ruzamiz uzoq edi, lekin siz buni qildingiz! Agar siz ushbu va oldingi ma'ruzalarning ba'zi qismlarini to'liq tushunmagan bo'lsangiz, xavotir olmang, kelajakda biz bu mavzularga bir necha bor to'xtalib o'tamiz. Mana siz uchun foydali havolalar:
  • Mantiqiy operatorlar - JavaRush mantiqiy operatsiyalar bo'yicha ma'ruza. Biz ularga tez orada erisha olmaymiz, lekin siz ularni hozir o'qishingiz mumkin, hech qanday zarar bo'lmaydi
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION