JavaRush /Java blogi /Random-UZ /Java tilidagi mantiqiy operatorlar

Java tilidagi mantiqiy operatorlar

Guruhda nashr etilgan
Java-da mantiqiy operatsiyalar.  Java-da bitli operatsiyalar - 1

Java-da mantiqiy operatsiyalar

Mantiqiy amallar mantiqiy operatorlar yordamida bajariladi. Tavtologiyani kechiring, lekin ishlar aynan shunday. Asosiy mantiqiy operatsiyalar (dasturlash va matematikada) mantiqiy argumentlarga (operandlarga) qo'llanilishi mumkin, shuningdek, raqamlar ustidagi arifmetik amallarga o'xshash murakkabroq ifodalarni shakllantirish uchun ham ishlatilishi mumkin. Masalan, ifoda:

(a | b) | (c < 100) & !(true) ^ (q == 5)
to'rtta operandga ega bo'lgan murakkab mantiqiy ifoda: (a | b), bu erda аva btipidagi o'zgaruvchilar boolean (c < 100) (true) (q == 5) .O'z navbatida oddiy mantiqiy ifoda (a | b)ham ikkita operand argumentidan iborat. Mantiqiy operand - bu to'g'ri yoki noto'g'ri, rost yoki noto'g'ri deb aytish mumkin bo'lgan ifoda . Java tilida mantiqiy operand tur yoki mantiqiy ifodadir boolean, masalan:
  • (2 < 1)— mantiqiy operand, uning qiymati noto'g'ri
  • true- qiymati aniq rost bo'lgan mantiqiy operand
  • boolean a- mantiqiy operand ham bo'lishi mumkin, masalan, mantiqiy a
  • int a = 2- mantiqiy operand emas , u faqat turdagi o'zgaruvchidirint
  • String a = "true"mantiqiy operand ham emas . Bu matn qiymati bo'lgan satrdir "true".
Java-da quyidagi mantiqiy operatsiyalar mavjud:
  • Mantiqiy inkor , shuningdek, inversiya sifatida ham tanilgan NOT. !Java-da operand oldidan “ ” belgisi bilan ko'rsatiladi . Bitta operand uchun amal qiladi.
  • Mantiqiy va , u ham ANDbog‘lovchidir. &U qo'llaniladigan ikkita operand o'rtasida "" belgisi bilan ko'rsatilgan .
  • Mantiqiy yoki Java-da u ham - OR, u ham disjunksiyadir. |Java-da u ikkita operand orasidagi “ ” belgisi bilan ko'rsatilgan .
  • Eksklyuziv yoki , XOR, qat'iy ajratish. ^Java-da u ikkita operand orasidagi “ ” belgisi bilan ko'rsatilgan .
  • Java tilida mantiqiy operatorlar shartli yoki sifatida belgilanadigan ||, shuningdek shartli va - ni o'z ichiga oladi &&.
Eslatma: matematik mantiqda ham ular ekvivalentlik munosabatini, boshqacha aytganda, tenglikni ko'rib chiqadilar. Biroq Java-da tenglik operatori==mantiqiy operator hisoblanmaydi. Diqqat! Java-da mantiqiy operatorlar&va|ham^amal qiladi. Bunday holda, ular biroz boshqacha ishlaydi va bitli (yoki bitli) mantiqiy operatorlar deb ataladi. Ular haqida - maqolaning oxirigacha. Keling, Java mantiqiy operatorlarining har birining qisqacha tavsifi bilan jadvalni ko'rib chiqamiz va quyida biz ularni batafsilroq tavsiflaymiz va kod misollarini keltiramiz.
Java operatori Ism Turi Qisqa Tasvir Misol
! Mantiqiy "yo'q" (inkor) Birlik !x"x emas" degan ma'noni anglatadi. Operand noto'g'ri bo'lsa, true qiymatini qaytaradi . Operand rost bo'lsa false qaytaradi . boolean x = true;
Keyin
// !x == false
& Mantiqiy VA ( AND, ko'paytirish) Ikkilik Ikkala operand ham rost bo'lsa, true qiymatini qaytaradi . a = true;
b = false;
Keyin
a & b == false
| Mantiqiy OR ( OR, qo'shimcha) Ikkilik Operandlardan kamida bittasi rost bo'lsa, true qiymatini qaytaradi . a = true;
b = false;
Keyin
a | b == true
^ Mantiqiy eksklyuziv OR ( XOR) Ikkilik Operandlardan faqat bittasi rost bo'lsa, true qiymatini qaytaradi . Ikkala operand ham rost yoki noto'g'ri bo'lsa, false qaytaradi . Aslida, agar operandlar boshqacha bo'lsa, u haqiqatni qaytaradi . a = true;
b = false;
Keyin
a ^ b == true
&& Shartli AND (qisqa mantiqiy AND) Ikkilik Xuddi shu, &lekin chapdagi operand false bo'lsa &, bu operator ikkinchi operandni tekshirmasdan false qaytaradi .
|| Shartli OR (qisqa mantiqiy OR) Ikkilik Xuddi shunday, |lekin chapdagi operator true bo'lsa , operator ikkinchi operandni tekshirmasdan true ni qaytaradi.

JavaRush kursidagi mantiqiy operatsiyalar

Mantiqiy operatsiyalardan qochishning iloji yo'q va JavaRush kursida ular shartlar va mantiqiy ma'lumotlar turi bilan birga birinchi darajalardan paydo bo'ladi. Dasturchilar asta-sekin matematik mantiq usullaridan foydalanishni o'rganadilar. Mantiqiy tuzilmalar bilan ishonchli manipulyatsiyalar uchun ma'lum bir epchillik va ma'lum jarayonlarni tushunish kerak. Shunday qilib, ko'p o'quvchilar endi sintaksis va konstruktsiyalar bilan to'g'ridan-to'g'ri chalg'itmay, topshiriqning mohiyatini o'rganishga harakat qiladigan Multithreading kvestining oxirida ushbu operatsiyalar batafsilroq va butunlay boshqacha darajada yondashiladi.

Java-da mantiqiy operatsiyalar.  Java-da bitli operatsiyalar - 2

Mantiqiy inkor operatori!

Bu operator unary, ya'ni u bitta mantiqiy ifoda yoki operandga tegishli. Tushunish juda oddiy, har qanday inkor kabi: operator shunchaki ifodaning ma'nosini uning teskarisiga o'zgartiradi. Haqiqat jadvali yoki inkor operatsiyasini bajarish natijalari:
a qiymati !a
yolg'on rost
rost yolg'on
Misol. Mantiqiy inkor operatsiyasi
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

   }
}
Dasturning chiqishi quyidagicha bo'ladi:

false
true
false

Mantiqiy VA - &, shuningdek shartli VA - &&

Mantiqiy AND yoki birikma ikkita ifodaga qo'llaniladi va uning natijasi ikkala operand ham rost bo'lsagina to'g'ri bo'ladi. aYa'ni, agar yoki operandlaridan biri noto'g'rib bo'lsa , ikkinchi operatorning qiymatidan qat'i nazar, ifoda noto'g'ri bo'ladi . Agar siz haqiqatni 1 raqami va yolg'onni 0 deb tasavvur qilsangiz, operator oddiy ko'paytirish bilan bir xil ishlaydi. Shuning uchun mantiqiy VA ko'pincha "mantiqiy ko'paytirish" deb ataladi. Aytgancha, bu fakt operatorning ishini tezda eslab qolishga yordam beradi va uni mantiqiy yoki operator bilan aralashtirib yubormaydi . Haqiqat jadvali VA, bu ham operator ishining natijasidira & b&&|&
a b a&b
rost rost rost
rost yolg'on yolg'on
yolg'on rost yolg'on
yolg'on yolg'on yolg'on
Mantiqiy VA, u ham bog'lovchidir, misollar:
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
   }
}
Dastur natijasi:

false
true
false
false
Operator &&ba'zan "qisqa AND" deb ataladi. Mantiqiy operandlar bilan ishlashda operator bilan bir xil natija beradi &. Biroq, uning ishida farq bor. Shunday qilib, siz allaqachon payqadingizki, agar a & b() ifodasidagi operand noto'g'ria bo'lsa , unda operandning qiymatini tekshirish mantiqiy emas : operatsiya natijasi, albatta, noto'g'ri bo'ladi . Shunday qilib, agar bizga ikkinchi operandning qiymati printsipial jihatdan kerak bo'lmasa, uni ishlatib, dasturdagi hisob-kitoblar sonini kamaytiramiz. Agar misoldagi barcha operatorlarni bilan almashtirsak , natija aynan bir xil bo‘ladi, lekin dasturning o‘zi biroz tezroq ishlaydi (garchi biz buni sezmaymiz, chunki gap mili-mikro... qisqasi. , juda kichik vaqt birliklari). b&&&&&

Mantiqiy OR - operator |, shuningdek shartli OR - operator ||

Java tilidagi OR operatori belgi bilan ifodalanadi |. Mantiqiy OR yoki dis'yunksiya ikkita ifodaga qo'llaniladi va agar ikkala operand ham yolg'on bo'lsa, uning natijasi yolg'on bo'ladi. Bu erda biz ma'lum darajada operator misolidagi kabi bir xil rasmni kuzatamiz &, lekin buning aksi. Ya'ni, agar kamida bitta operand rost bo'lsa, ikkinchi operatorning qiymatidan qat'i nazar, ifoda haqiqata | b bo'lishi kafolatlanadi . Agar u mantiqiy ko'paytirish kabi harakat qilsa, u holda OR mantiqiy qo'shishdir, agar siz rost 1 va noto'g'ri 0 deb tasavvur qilsangiz. Mantiqiy qo'shish oddiy qo'shishdan farqli ishlashini yodda tuting. Bu holda 1 + 1 2 ga emas, balki 1 ga teng (bu tizimda 2 raqami oddiygina mavjud emas). Ba'zan dis'yunksiya 0 va 1 maksimal deb tushuniladi va bu holda, agar kamida bitta operand 1 ga teng bo'lsa ( rost ), biz aynan rost ni olamiz . OR haqiqat jadvali, shuningdek, operator natijasi sifatida ham tanilgan : &|
a b a | b
rost rost rost
rost yolg'on rost
yolg'on rost rost
yolg'on yolg'on yolg'on
Mantiqiy OR, shuningdek, disjunksiya sifatida ham tanilgan, misol:
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);

   }
}
Natija:

false
true
true
true
Agar shartli OR operatoridan foydalansak - ||o'rniga |, biz aynan bir xil natijaga erishamiz, lekin shartli AND misolidagi kabi &&, u iqtisodiy ta'sir ko'rsatadi: agar biz birinchi operandga "to'g'ri kelsak" true ga teng bo'lsa , qiymati ikkinchi operand tekshirilmaydi, lekin darhol natija haqiqatdir .

XOR Java - mantiqiy eksklyuziv OR - operator ^

XOR, modul 2 qoʻshish, mantiqiy XOR, mantiqiy ayirish, qatʼiy disʼyunksiya, bit boʻyicha toʻldiruvchi... operator ^mantiqiy algebrada koʻp nomlarga ega. Ushbu operatorni ikkita operandga qo'llash natijasi, agar operandlar boshqacha bo'lsa, rost bo'ladi va operandlar bir xil bo'lsa, noto'g'ri bo'ladi. Shuning uchun uni nollarni ( yolg'on ) va birlarni ( rost ) ayirish bilan solishtirish qulay . Haqiqat jadvali XOR, shuningdek, operator natijasi sifatida ham tanilgan ^:
Mantiqiy a Mantiqiy b a^b
rost rost yolg'on
rost yolg'on rost
yolg'on rost rost
yolg'on yolg'on yolg'on
Misol:
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);
   }
}
Natija:

false
false
true
true

Mantiqiy operatsiyalarning ustuvorligi

Matematikada bo'lgani kabi, dasturlashda ham operatorlar bir xil ifodada paydo bo'lganda, muayyan bajarish tartibiga ega. Birlik operatorlar ikkilik operatorlarga nisbatan afzalliklarga ega va ko'paytirish (hatto mantiqiy) qo'shishga nisbatan. Biz mantiqiy operatorlarni roʻyxatda yuqoriroq joylashtirdik, ularning ustuvorligi shunchalik yuqori boʻladi:
  1. !
  2. &
  3. ^
  4. |
  5. &&
  6. ||
Keling, misollarni ko'rib chiqaylik. Bog'lovchi va ayirma ( &va |) har xil ustunlikka ega:
public class Solution {
   public static void main(String[] args) {
       boolean a = true, b = true, c = false;
       System.out.println(a | b & c);
}
Agar chapdan o'ngga o'tadigan bo'lsak, ya'ni avval operatorni |, keyin esa - ni qo'llasak, false& qiymatini olamiz . Ammo, aslida, agar siz ushbu dasturni ishga tushirsangiz, chiqish haqiqat bo'lishiga amin bo'lasiz , chunki mantiqiy AND operatori mantiqiy OR operatoriga qaraganda yuqoriroq ustuvorlikka ega bo'ladi . Chalkashmaslik uchun, nima ko'paytirish va nima qo'shish kabi harakat qilishini yodda tutishingiz kerak . Siz ustuvorlik tartibini o'zgartirishingiz mumkin. Xuddi maktab matematikasidagi kabi qavslardan foydalaning. Keling, misol kodimizni biroz o'zgartiraylik: &|&|
public class Solution {
   public static void main(String[] args) {
       boolean a = true, b = true, c = false;
       System.out.println((a|b)&c);
}
Nima gaplar? Avval qavs ichida mantiqiy qo'shishni, keyin esa ko'paytirishni qo'llaymiz. Natija noto'g'ri bo'ladi .

Murakkab mantiqiy ifodalar

Albatta, biz mantiqiy ifodalar va operatorlarni birlashtira olamiz. Maqolaning boshidan iborani eslaylik:
(a | b) | (c < 100) & !(true) ^ (q == 5)
Endi bu unchalik qo'rqinchli ko'rinmaydi. Oldin , va ning qiymatlarini aniqlagan holda a, uning qiymatini aks ettiruvchi dastur yozamiz . Murakkab mantiqiy ifodaning qiymatini hisoblash misoli bсq
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));
   }
}
Eslatma:qbizning o'zgaruvchimiz ga tegishli int, lekin q == 5bu mantiqiy ifoda bo'lib, u false ga teng , chunki yuqorida biz q2 raqami bilan ishga tushirdik. O'zgaruvchi bilan ham xuddi shunday c. Bu raqam 25 ga teng, lekin (c < 100) true ga teng mantiqiy ifodadir . Ushbu dasturning natijasi:

true
Murakkab mantiqiy iboralar juda murakkab va tarmoqli sharoitlarni sinab ko'rish uchun ishlatilishi mumkin, lekin ularni ortiqcha ishlatmaslik kerak: ular kodni o'qishni qiyinlashtiradi.

Bit bo'yicha (bit bo'yicha) operatorlar

Maqolaning boshida biz operatorlar &, |va ^Java butun son turlariga nisbatan ishlatilishi mumkinligini eslatib o'tdik. Bunday holda ular bitli operatorlardir. Ular bitli deb ham ataladi, chunki bitta raqam bir bit bo'lib, bu operatsiyalar maxsus bitlar bilan ishlaydi. Albatta, ular mantiqiy operatorlarga qaraganda biroz boshqacha ishlaydi va qanday qilib aniq tushunish uchun ikkilik sanoq sistemasi nima ekanligini bilish kerak. Agar siz bu haqda hech narsa bilmasangiz yoki butunlay unutgan bo'lsangiz, avval Java maqolasini o'qib chiqishingizni tavsiya qilamiz: bitlar va baytlar va boshqalarga ikkilik sanoq tizimida faqat ikkita raqam - 0 va 1 va barcha ma'lumotlar mavjudligini eslatib o'tamiz. kompyuterda shartli nol va birlar yordamida aniq ifodalanadi. Biz o‘rganib qolgan har qanday raqamlarni (o‘nlik; ular uchun 0 dan 9 gacha bo‘lgan 10 xil raqam bor, ular yordamida istalgan sonlarni yozamiz) ikkilik sanoq sistemasida ifodalanishi mumkin. O'nlik sonni ketma-ket bo'linish yordamida ikkilik sanoq tizimiga (2) sanoq tizimi bazasidan foydalangan holda o'zgartirishingiz mumkin. Har bir bosqichda teskari tartibda yozilgan bo'linishning qoldiqlari bizga kerakli ikkilik sonni beradi. Bu erda, masalan, o'nlik 103 raqamini ikkilik ko'rinishga aylantirish: Java-da mantiqiy operatsiyalar.  Java-da bitli operatsiyalar - 3

JavaRush kursida ikkilik sanoq tizimi

JavaRush kursida ular MultiThreading kvestini (10-daraja, 1-ma'ruza) o'rganayotganda ikkilik sanoq tizimi haqida gapiradilar; ma'ruzadan so'ng konsolidatsiya uchun bir nechta vazifalar mavjud. Biroq, bu mavzu unchalik qiyin emas va agar siz hali kursda unchalik uzoqqa bormagan bo'lsangiz ham, ehtimol siz buni tushunib olasiz.

&Java va |ga qo'shimcha ravishda ^bitli operatorlardan ham foydalanadi:
  • ~ bitli inkor operatori
  • >>bit bo'yicha o'ngga siljitish
  • >>>belgisiz bit bo'yicha o'ngga siljish
  • <<bit bo'yicha chapga siljitish
Yangi boshlanuvchilar uchun bitli operatorlar juda chalkash va sun'iy ko'rinadi. Ular ko'pincha ta'lim muammolarini hal qilishdan tashqari, nima uchun kerakligini tushunishmaydi. Aslida, ular samarali bo'linish va ko'paytirishni tashkil qilish uchun kamida ishlatilishi mumkin va mutaxassislar ularni kodlash / dekodlash, shifrlash va tasodifiy sonlarni yaratish uchun ishlatishadi.

Bitli operatorlar &, | va ^

Keling, ushbu operatorlarning qanday ishlashini misol qilib ko'rib chiqaylik. Aytaylik, bizda ikkita butun son bor:
int a = 25;
int b = 112; 
Biz ularga uchta operatsiyani qo'llashimiz kerak &va natijani ekranda ko'rsatamiz. Mana dastur kodi: |^
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);

   }
}
Dasturning natijasi quyidagicha:

a & b = 16
a | b = 121
a ^ b = 105
Agar nima bo'layotganini tushunmasangiz, natija juda va juda sirli ko'rinadi. Aslida, hamma narsa ko'rinadiganidan ko'ra oddiyroq. Bitli operatorlar operand raqamlarini ikkilik ko'rinishda "ko'radilar". Va keyin ular qo'llaniladi mantiqiy operatorlar &, |yoki ^ikkala raqamning mos keladigan raqamlari (bitlari). Shunday qilib, &25 raqamining ikkilik ko'rinishining oxirgi biti uchun mantiqiy ravishda 112 sonining ikkilik ko'rinishining oxirgi bitiga, oxirgidan oldingi bit bilan oxirgi bitga qo'shiladi va hokazo: Xuddi Java-da mantiqiy operatsiyalar.  Java-da bitli operatsiyalar - 4shu mantiqni 112 raqami bilan birga ko'rish mumkin. holati |va ^. Java-da mantiqiy operatsiyalar.  Java-da bitli operatsiyalar - 5

Bitni chapga yoki o'ngga siljitish

Java-da bir nechta bitni almashtirish operatorlari mavjud. Eng ko'p ishlatiladigan operatorlar <<va >>. Ular raqamning ikkilik ko'rinishini mos ravishda chapga yoki o'ngga, o'ngga siljigan taqdirda esa belgini saqlab qoladi (biz quyida belgini saqlash nimani anglatishini tushuntiramiz). Yana bir o'ngga siljish operatori mavjud >>>. Xuddi shu narsani qiladi, lekin >>belgini saqlamaydi. Shunday qilib, keling, misol yordamida ularning ishlarini ko'rib chiqaylik. int a = 13 a << 1a sonining ikkilik tasvirining barcha bitlarini chapga 1 bitga siljitadi. Soddalashtirish uchun ikkilik tizimdagi 13 raqamini 0000 1101 deb tasavvur qilaylik. Aslida bu raqam quyidagicha ko'rinadi: 00000000 00000000 00000000 00001101, chunki Java intraqamlar uchun 4 bayt yoki 32 bit ajratadi. Biroq, bu misolda rol o'ynamaydi, shuning uchun bu misolda biz raqamimizni bir bayt deb hisoblaymiz. Java-da mantiqiy operatsiyalar.  Java-da bitli operatsiyalar - 6O'ng tomonda bo'shatilgan bit nol bilan to'ldiriladi. Ushbu operatsiya natijasida biz 26 raqamini olamiz. a << 2U raqamning ikkilik tasvirining barcha bitlarini a2 bitga chapga siljitadi va o'ng tomonda bo'shatilgan ikkita bit nol bilan to'ldiriladi. Natijada, biz 52 raqamini olamiz. a << 3Natijada 104 bo'ladi ... Naqshga e'tibor bering? Bit boʻyicha chapga n ta pozitsiyaga siljitish araqamni a2 ga n ning darajasiga koʻpaytirish kabi ishlaydi. Xuddi shu narsa manfiy raqamlarga ham tegishli. Bu -13 << 3-104 natijani beradi. a >> nn sonning ikkilik tasvirini o'ngga siljitadi. Misol uchun, 13 >> 1 1101 raqamini 0110 raqamiga aylantiradi, ya'ni 6. Va 13 >> 2natijada 3 bo'ladi. Ya'ni, mohiyatan bu erda sonni 2 ga n ning darajasiga ajratamiz, bu erda n - siljishlar soni o'ngga, lekin bitta ogohlantirish bilan: agar raqam toq bo'lsa, bu operatsiya davomida biz raqamning oxirgi bitini qayta o'rnatganga o'xshaymiz. Ammo salbiy holatlar bilan vaziyat biroz boshqacha. Aytaylik, agar siz undan biror operatsiyani bajarishni so'rasangiz, dastur nima ishlab chiqarishini tekshirishga harakat qiling -13 >> 1. Siz o'ylaganingizdek -6 emas, -7 raqamini ko'rasiz. Bu Java va boshqa dasturlash tillarida manfiy raqamlarning saqlanishi tufayli sodir bo'ladi. Ular qo'shimcha kod deb ataladigan narsada saqlanadi. Bunday holda, eng muhim raqam (chapdagi) belgi ostida beriladi. Salbiy raqam bo'lsa, eng muhim raqam 1 dir.

Qo'shimcha kod

Keling, raqamni ko'rib chiqaylik int a = 13. Agar dasturda buyruq yordamida konsolda uning ikkilik ko'rinishini chop etsangiz System.out.println(Integer.toBinaryString(a));, biz 1101 ni olamiz. Aslida, bu qisqartma belgi, chunki turdagi raqam intxotirada 4 baytni egallaydi, shuning uchun kompyuter uni ko'proq "ko'radi". shunga o'xshash:

00000000 00000000 00000000 00001101
Eng muhim raqam nol, ya'ni bizda ijobiy raqam bor. Qo'shimcha kodga aylantirish uchun:
  1. Biz "to'g'ridan-to'g'ri kod" deb nomlangan raqamga -13 raqamini yozamiz. Buning uchun raqamning eng muhim raqamini 1 ga o'zgartiring.
    Amalning natijasi:

    
    10000000 0000000 0000000 00001101
  2. Keyinchalik, ishora bitidan tashqari barcha bitlarni (0 ni 1 ga, 1 ni 0 ga o'zgartiramiz) o'zgartiramiz. Aslida, biz uni allaqachon o'zgartirganmiz.
    Aksiya natijasi:

    
    11111111 11111111 11111111 11110010

    (ha, 1 va 2-bosqichlarni birlashtirish mumkin, lekin bu haqda shunday o'ylash yaxshiroqdir)

  3. Olingan raqamga 1 qo'shing.
    Amal natijasi:

    
    11111111 11111111 11111111 11110011
Olingan ikkilik son -13 bo'lib, ikkita to'ldiruvchi kodda yoziladi va bitni siljitish (va boshqa operatsiyalar) unga maxsus qo'llaniladi. Faqat operatsiya mantig'idagi farq barcha operatsiyalarda sezilmaydi. Aytaylik, chapga bir xil siljish uchun farq sezilmaydi, biz manfiy raqamlar bilan xuddi musbat raqamlar bilan ishlashimiz mumkin. Endi o'ngga o'taylik -13 >> 1. Bizning operatorimiz >>belgini saqlab qolganligi sababli, bu operatsiyada chap tomonda bo'shatilgan barcha bitlar nol bilan emas, balki birlik bilan to'ldiriladi. Shunday qilib, raqamni almashtirish

11111111 11111111 11111111 11110011
bir bit o'ngga, natijada quyidagi bitlar ketma-ketligi paydo bo'ladi:

11111111 11111111 11111111 11111001
Agar biz ushbu raqamni to'g'ridan-to'g'ri kodga aylantirsak (ya'ni, avval 1 ni ayirib, keyin birinchisidan tashqari barcha bitlarni o'zgartirsak) biz raqamni olamiz:

10000000 00000000 00000000 00000111
yoki -7. Endi biz belgini saqlaydigan o'ngga siljish operatorini tushunganimizdan so'ng, u operatordan qanday farq qilishi aniq bo'ladi >>>. a >>> n— bu amal ishorasiz siljishdir, yaʼni sonning ikkilik koʻrinishini aoʻngga n ta bitga siljitadi, lekin chapda boʻshagan n ta bitni operator kabi birlar bilan emas >>, balki nollar bilan toʻldiradi. Operatsiyani qilaylik -13 >>> 1. -13Bizda allaqachon ikkita to'ldiruvchi raqam mavjud :

11111111 11111111 11111111 11110011
1 bitga o'ngga siljitish va bo'sh bitni nol bilan to'ldirish orqali biz quyidagi raqamni olamiz:

01111111 11111111 11111111 11111001
O'nli yozuvda raqam nima beradi 2147483641.

Bitli inkor operatori ~

Bu unar operator juda sodda ishlaydi: u butun sonning ikkilik tasvirining har bir bitini teskari qiladi. Keling, raqamni olaylik -13:

11111111 11111111 11111111 11110011
Bit bo'yicha inkor qilish operatsiyasi ~13har bir bitning qiymatini o'zgartiradi. Natijada biz quyidagilarni olamiz:

00000000 00000000 00000000 00001100
Yoki 12kasr shaklida.

Qisqacha xulosalar

  • Barcha mantiqiy operatorlar mantiqiy ifodalarga, ya'ni rost yoki noto'g'ri deb aytish mumkin bo'lganlarga qo'llaniladi .
  • Если операторы &, | or ^ применяются к числам, речь идёт уже не о логических операциях, а о побитовых. То есть оба числа переводятся в двоичную систему и к этим числам побитово применяют операции логического сложения, умножения or вычитания.
  • В математической логике операторам & и | соответствуют конъюнкция и дизъюнкция.
  • Логическое И похоже на умножения 1 (true) и 0 (false).
  • Логическое ИЛИ напоминает поиск максимума среди 1 (true) и 0 (false).
  • Для побитового отрицания целого числа a используется операция ~a.
  • Для логического отрицания булевского выражения a используется операция !a.
  • Отрицательные числа хранятся и обрабатываются в дополнительном codeе.
  • Поразрядный сдвиг вправо может сохранять знак (>>), а может — не сохранять (>>>).
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION