JavaRush /Блоги Java /Random-TG /Операторҳои мантиқӣ дар Java

Операторҳои мантиқӣ дар Java

Дар гурӯҳ нашр шудааст
Амалиёти мантиқӣ дар Java.  Амалиётҳои битвӣ дар Java - 1

Амалиёти мантиқӣ дар Java

Амалиёти мантиқӣ бо истифода аз операторҳои булӣ иҷро карда мешаванд. Тавтологияро бубахшед, аммо корҳо маҳз ҳамин тавр аст. Амалҳои асосии мантиқӣ (дар барномасозӣ ва математика) метавонанд ба аргументҳои мантиқӣ (операндҳо) татбиқ карда шаванд ва инчунин метавонанд барои ташаккули ифодаҳои мураккабтар, монанд ба амалҳои арифметикӣ оид ба ададҳо истифода шаванд. Масалан, ифодаи:

(a | b) | (c < 100) & !(true) ^ (q == 5)
як ифодаи мураккаби мантиқӣ бо чор операнд аст: (a | b), дар ин ҷо ава bтағирёбандаҳои навъи boolean (c < 100) (true) (q == 5) .Дар навбати худ ифодаи оддии мантиқӣ (a | b)низ аз ду аргументи операндӣ иборат аст. Операнди мантиқӣ ифодаест, ки онро дуруст ё бардурӯғ, дуруст ё бардурӯғ гуфтан мумкин аст . Дар забони Java, операнди булӣ ифодаи намуд booleanё мантиқӣ мебошад, масалан:
  • (2 < 1)— операнди мантиқӣ, арзиши он дурӯғ аст
  • true- операнди мантиқӣ, ки арзиши он баръало дуруст аст
  • boolean a- инчунин метавонад операнди мантиқӣ бошад, ба монанди булӣ а
  • int a = 2- операнди мантиқӣ нест , он танҳо як тағирёбандаи намуд астint
  • String a = "true"инчунин як операнди мантиқӣ нест . Ин сатрест, ки арзиши матнаш "true".
Дар Java амалҳои мантиқии зерин мавҷуданд:
  • Инкори мантиқӣ , инчунин NOTбо номи инversion маълум аст. Дар Java, он бо аломати " " пеш аз операнд нишон дода мешавад . Ба як операнд дахл дорад.!
  • Мантиқӣ ва , он ҳам ANDпайвандак аст. Бо аломати " " байни ду операнд, ки ба онҳо татбиқ карда мешавад, нишон дода мешавад.&
  • Мантиқӣ ё дар Java , он инчунин - аст OR, он низ дизюнксия аст. Дар Java, он бо аломати " " байни ду операнд нишон дода мешавад.|
  • Истисноӣ ё , XOR, дизюнксияи қатъӣ. Дар Java, он бо аломати " " байни ду операнд нишон дода мешавад.^
  • Дар Java операторҳои мантиқӣ шартӣ ё , ҳамчун , инчунин шартӣ ва -ро дар бар мегиранд .||&&
Эзоҳ: инчунин дар мантиқи математикӣ муносибати баробарӣ, ба ибораи дигар, баробарӣ ба назар мерасанд. Аммо, дар Java оператори баробарӣ==оператори мантиқӣ ҳисобида намешавад. Диққат! Дар Java, операторҳои мантиқӣ&ва|инчунин^ба ададҳои бутун татбиқ мешаванд. Дар ин ҳолат, онҳо каме дигар кор мекунанд ва операторҳои мантиқии битвӣ (ё битвӣ) номида мешаванд. Дар бораи онҳо - то охири мақола. Биёед ҷадвалеро бо тавсифи мухтасари ҳар як оператори мантиқии Java дида бароем ва дар поён мо онҳоро муфассалтар тавсиф мекунем ва мисолҳои рамзӣ медиҳем.
Оператори Java Ном Навъи Тавсифи мухтасар Мисол
! Мантиқии "не" (инкор) Якбора !xмаънои «на х»-ро дорад. Агар операнд бардурӯғ бошад, ҳақиқиро бармегардонад . Агар операнд ҳақиқӣ бошад, дурӯғро бармегардонад . boolean x = true;
Баъд
// !x == false
& Мантиқӣ ВА ( AND, зарб) Бинарӣ Агар ҳарду операнд ҳақиқӣ бошанд, ҳақиқиро бармегардонад . a = true;
b = false;
Баъд
a & b == false
| Ё мантиқӣ ( OR, илова) Бинарӣ Ҳақиқатро бармегардонад , агар ақаллан яке аз операндҳо дуруст бошад . a = true;
b = false;
Баъд
a | b == true
^ Истисноии мантиқӣ Ё ( XOR) Бинарӣ Ҳақиқатро бармегардонад , агар як ва танҳо яке аз операндҳо дуруст бошад . Агар ҳарду операнд ҳақиқӣ ё бардурӯғ бошанд, дурӯғро бармегардонад . Аслан, он ҳақиқӣ бармегардад , агар операндҳо гуногун бошанд. a = true;
b = false;
Баъд
a ^ b == true
&& Шартӣ ВА (ва мантиқии кӯтоҳмуддат) Бинарӣ Ҳамон тавре ки , &аммо агар операнд дар тарафи чапи аз false& бошад , ин оператор бе тафтиши операнди дуюм хаторо бармегардонад.
|| Ё шартӣ (ё мантиқии кӯтоҳ) Бинарӣ Ҳамон тавре ки , |аммо агар оператор дар тарафи чап true бошад , оператор бе тафтиши операнди дуюм true -ро бармегардонад.

Амалиёти мантиқӣ дар курси JavaRush

Аз амалҳои мантиқӣ гурез нест ва дар курси JavaRush онҳо аз сатҳҳои аввал дар баробари шартҳо ва навъи маълумотҳои булӣ пайдо мешаванд. Барномасозон тадриҷан истифода бурдани усулҳои мантиқи математикиро меомӯзанд. Барои манипуляцияҳои боэътимод бо сохторҳои мантиқӣ, маҳорати муайян ва фаҳмиши равандҳои муайян лозим аст. Ҳамин тавр, ба ин амалиётҳо дар охири квести Multithreading муфассалтар ва дар сатҳи комилан дигар муносибат карда мешаванд, вақте ки аксари донишҷӯён дигар бевосита аз синтаксис ва сохторҳо парешон нестанд, балки кӯшиш мекунанд, ки моҳияти вазифаро омӯзанд.

Амалиёти мантиқӣ дар Java.  Амалиёти битвӣ дар Java - 2

Оператори радкунии мантиқӣ!

Ин оператор якранг аст, яъне ба як ифода ё операнди булӣ дахл дорад. Фаҳмидани он хеле осон аст, ба монанди ҳама гуна радкунӣ: оператор маънои ифодаро ба муқобor он иваз мекунад. Ҷадвали ҳақиқат ё натиҷаҳои иҷрои амалиёти радкунӣ:
Арзиши а
дурӯғ дуруст
дуруст дурӯғ
Мисол. Амалиёти радди мантиқӣ
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

   }
}
Натиҷаи барнома чунин хоҳад буд:

false
true
false

Мантиқӣ ВА - &, инчунин шартӣ ВА - &&

Мантиқи ВА ё пайвандак ба ду ифода истифода мешавад ва натиҷаи он танҳо дар сурати дуруст будани ҳарду операнд дуруст хоҳад буд. Яъне, агар яке аз операндҳо aё операндҳо бардурӯғb бошад , пас новобаста аз арзиши оператори дуюм ифода дурӯғ хоҳад буд . Агар шумо тасаввур кунед, ки ҳақиқӣ рақами 1 ва бардурӯғ 0 аст, пас оператор айнан ҳамон зарби муқаррарӣ кор мекунад. Аз ин рӯ, ВА-и мантиқӣ аксар вақт "зарбкунии мантиқӣ" номида мешавад. Ва, дар омади гап, ин далел кӯмак мекунад, ки амалиёти операторро зуд ба ёд оред ва онро бо мантиқӣ ё оператор омехта накунед . Ҷадвали ҳақиқат ВА, он инчунин натиҷаи кори оператор астa & b&&|&
а б а&б
дуруст дуруст дуруст
дуруст дурӯғ дурӯғ
дурӯғ дуруст дурӯғ
дурӯғ дурӯғ дурӯғ
Мантиқӣ ВА, он инчунин пайвандак аст, мисолҳо:
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
   }
}
Натиҷаи барнома:

false
true
false
false
Оператор &&баъзан "кӯтоҳ ВА" номида мешавад. Он ҳамон натиҷаро ҳангоми кор бо операндҳои мантиқӣ ба монанди оператор медиҳад &. Вале дар худи кори у тафовут мавчуд аст. Ҳамин тавр, шумо аллакай пай бурдед, ки агар a & bоперанд дар ифодаи ( ) нодурустa бошад , пас тафтиш кардани арзиши операнд маъно надорад : натиҷаи амалиёт бешубҳа бардурӯғ хоҳад буд . Пас, агар мо ба арзиши операнди дуюм ниёз надорем, бо истифода аз он мо шумораи ҳисобҳоро дар барнома кам мекунем. Агар ҳамаи операторҳои мисолро бо - иваз кунем , натиҷа комилан якхела мешавад, аммо худи барнома каме тезтар кор мекунад (гарчанде ки мо инро пайхас намекунем, зеро сухан дар бораи мor-микро... меравад. , воҳидҳои хеле хурди вақт). b&&&&&

Ё мантиқӣ оператори |, инчунин шартӣ OR оператори || мебошад

Оператори OR дар Java бо аломати |. Ё ё дизъюнксияи мантиқӣ ба ду ифода истифода мешавад ва натиҷаи он бардурӯғ хоҳад буд, агар ҳарду операнд дурӯғ бошад. Дар ин ҷо мо то андозае ҳамон манзараро мушоҳида мекунем, ки дар мисоли оператор &, аммо комилан баръакс. Яъне, агар ақаллан як операнд true бошад, пас новобаста аз арзиши оператори дуюм дуруст будани ифода кафолат дода мешавад. Агар он мисли зарби мантиқӣ рафтор кунад, Ё ин иловаи мантиқӣ аст, агар шумо тасаввур кунед, ки ҳақиқӣ 1 ва бардурӯғ 0 аст. Фақат дар хотир доред, ки иловаи мантиқӣ аз иловаи муқаррарӣ фарқ мекунад. 1 + 1 дар ин ҳолат на ба 2, балки ба 1 баробар аст (рақами 2 дар ин система танҳо вуҷуд надорад). Баъзан дизъюнксия ҳамчун максимумҳои 0 ва 1 фаҳмида мешавад ва дар ин ҳолат, агар ақаллан як операнд ба 1 баробар бошад ( true ), мо маҳз ростро мегирем . Ё ҷадвали ҳақиқат, инчунин бо натиҷаи оператор маълум аст : a | b&|
а б а | б
дуруст дуруст дуруст
дуруст дурӯғ дуруст
дурӯғ дуруст дуруст
дурӯғ дурӯғ дурӯғ
Ё мантиқӣ, ки бо номи дизюнксия низ маълум аст, мисол:
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);

   }
}
Натиҷа:

false
true
true
true
Агар мо оператори шартии Ё -ро истифода барем - ||ба ҷои |, мо маҳз ҳамон натиҷаро ба даст меорем, аммо, ба монанди ҳолати шартии AND &&, он аз ҷиҳати иқтисодӣ амал мекунад: агар мо ба операнди якум баробар ба true "даромад кунем" , арзиши операнди дуюм санҷида намешавад, аммо дарҳол натиҷа дуруст аст .

XOR Java - истисноии мантиқӣ Ё - оператор ^

XOR, модули 2 илова, XOR мантиқӣ, тарҳи мантиқӣ, дизюнксияи қатъӣ, пурракунии битӣ... оператор ^дар алгебраи булӣ номҳои зиёд дорад. Натиҷаи истифодаи ин оператор ба ду операнд дуруст хоҳад буд , агар операндҳо гуногун бошанд ва агар операндҳо якхела бошанд, дурӯғ бошад . Аз ин рӯ, муқоисаи онро бо тарҳи сифрҳо ( дурӯғ ) ва якҳо ( true ) қулай аст. Ҷадвали ҳақиқат XOR, ки ҳамчун натиҷаи оператор маълум аст ^:
Булӣ а Булӣ б а^б
дуруст дуруст дурӯғ
дуруст дурӯғ дуруст
дурӯғ дуруст дуруст
дурӯғ дурӯғ дурӯғ
Мисол:
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);
   }
}
Натиҷа:

false
false
true
true

Афзалияти амалҳои мантиқӣ

Мисли дар математика, операторҳои барномасозӣ, вақте ки онҳо дар як ифода пайдо мешаванд, тартиби мушаххаси иҷро доранд. Операторҳои унарӣ нисбат ба операторҳои бинарӣ ва зарб (ҳатто мантиқӣ) нисбат ба илова бартарӣ доранд. Мо операторҳои мантиқиро дар рӯйхат баландтар ҷой додаем, ҳамон қадар афзалияти онҳо баландтар аст:
  1. !
  2. &
  3. ^
  4. |
  5. &&
  6. ||
Биёед мисолҳоро дида бароем. Конъюнксия ва дизъюнксия ( &ва |) афзалияти гуногун доранд:
public class Solution {
   public static void main(String[] args) {
       boolean a = true, b = true, c = false;
       System.out.println(a | b & c);
}
Агар мо аз чап ба рост кор мекардем, яъне аввал операторро истифода мебурдем |ва баъд - , мо арзиши false -ро& мегирифтем . Аммо дар асл, агар шумо ин барномаро иҷро кунед, шумо боварӣ ҳосил хоҳед кард, ки натиҷа дуруст хоҳад буд , зеро оператори мантиқии AND нисбат ба оператори мантиқии OR афзалияти бештар дорад . Барои роҳ надодан ба иштибоҳ, шумо бояд дар хотир доред, ки он чизе мисли зарб ва он чизе монанди илова мекунад. Шумо метавонед тартиби афзалиятро тағир диҳед. Мисли математикаи мактабӣ танҳо қавсҳоро истифода баред. Биёед рамзи мисоли худро каме тағир диҳем: &|&|
public class Solution {
   public static void main(String[] args) {
       boolean a = true, b = true, c = false;
       System.out.println((a|b)&c);
}
Чӣ хабар? Аввал мо иловаи мантиқиро дар қавс истифода мебарем ва баъд зарб. Натиҷа дурӯғ хоҳад буд .

Ифодаҳои мураккаби мантиқӣ

Албатта, мо метавонем ифодаҳои булӣ ва операторҳоро якҷоя кунем. Биёед ибораи аз аввали мақоларо ба ёд орем:
(a | b) | (c < 100) & !(true) ^ (q == 5)
Ҳоло он қадар даҳшатнок ба назар намерасад. Биёед барномаеро нависем, ки арзиши онро нишон дода, қаблан қиматҳои a, 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));
   }
}
Шарҳ:тағирёбандаи qмо навъи int, аммо q == 5ин ифодаи мантиқӣ аст ва он ба false баробар аст , зеро дар боло мо бо qрақами 2 оғоз кардем. Бо тағирёбандаи c. Ин адад ба 25 баробар аст, аммо (c < 100) ифодаи мантиқӣ аст, ки ба ҳақиқӣ баробар аст . Натиҷаи ин барнома:

true
Ифодаҳои мураккаби булӣ метавонанд барои санҷиши шароити хеле мураккаб ва шоха истифода шаванд, аммо онҳо набояд аз ҳад зиёд истифода шаванд: онҳо хондани codeро душвор мегардонанд.

Операторҳои битӣ (бита).

Дар аввали мақола мо зикр кардем, ки операторҳои &, |ва ^метавонанд дар робита бо намудҳои бутуни Java истифода шаванд. Дар ин ҳолат онҳо операторҳои битвӣ мебошанд. Онҳо инчунин ба бит номида мешаванд, зеро як рақам як бит аст ва ин амалиётҳо махсусан бо битҳо кор мекунанд. Албатта, онҳо нисбат ба операторҳои мантиқӣ то андозае фарқ мекунанд ва барои аниқ фаҳмидани он, ки чӣ тавр шумо бояд бидонед, ки системаи рақамҳои дуӣ чист. Агар шумо дар ин бора чизе намедонед ё тамоман фаромӯш карда бошед, тавсия медиҳем, ки аввал мақолаи Java-ро хонед: битҳо ва byteҳо ва ба ҳама хотиррасон кунед, ки дар системаи рақамҳои дуӣ танҳо ду рақам мавҷуд аст - 0 ва 1 ва ҳама маълумот. дар компютер маҳз бо истифода аз сифрҳо ва якҳо шартӣ ифода карда мешавад. Ҳар кадоме аз ададҳое, ки мо ба онҳо одат кардаем (даҳӣ; барои онҳо 10 рақами гуногун аз 0 то 9 мавҷуд аст, ки мо бо онҳо ҳама гуна ададро менависем) дар системаи шумориши дуӣ ифода кардан мумкин аст. Шумо метавонед адади даҳиро бо истифода аз тақсими пайдарпай ба сутун бо истифода аз пойгоҳи системаи рақамӣ ба дуӣ табдил диҳед (2). Қисми боқимондаи тақсимот дар ҳар як қадам, ки бо тартиби баръакс навишта шудааст, ба мо рақами дуии дилхоҳро медиҳад. Дар ин ҷо, масалан, табдor адади даҳии 103 ба намоиши дуӣ: Амалиёти мантиқӣ дар Java.  Амалиётҳои битвӣ дар Java - 3

Системаи рақамҳои дуӣ дар курси JavaRush

Дар курси JavaRush, онҳо ҳангоми омӯзиши квести MultiThreading (сатҳи 10, лексияи 1) дар бораи системаи рақамҳои дуӣ сӯҳбат мекунанд (дараҷаи 10, лексияи 1); пас аз лексия якчанд вазифаҳо барои муттаҳидсозӣ мавҷуданд. Аммо, ин мавзӯъ аслан душвор нест ва ҳатто агар шумо то ҳол дар ин курс ба он қадар дур нарафтед, эҳтимол шумо онро дарк хоҳед кард.

Илова ба &, |ва ^Java инчунин операторҳои битвиро истифода мебарад:
  • ~ оператори радкунии битӣ
  • >>ба самти каме ба рост гузаред
  • >>>гузариш ба рости беимзо
  • <<гузариш ба чап
Барои шурӯъкунандагон, операторҳои битвӣ хеле печида ва сунъӣ ба назар мерасанд. Онҳо аксар вақт намефаҳманд, ки онҳо барои чӣ лозиманд, ба истиснои ҳалли масъалаҳои таълимӣ. Дар асл, онҳо метавонанд ҳадди аққал барои ташкor тақсимот ва зарбҳои муассир истифода шаванд ва мутахассисон онҳоро барои рамзгузорӣ / рамзкушоӣ, рамзгузорӣ ва тавлиди рақамҳои тасодуфӣ истифода мебаранд.

Операторҳои Bitwise &, | ва ^

Биёед мисолеро дида бароем, ки ин операторҳо чӣ гуна кор мекунанд. Фарз мекунем, ки мо ду адад дорем:
int a = 25;
int b = 112; 
Мо бояд се амалро ба онҳо татбиқ кунем ва &натиҷаро дар экран нишон диҳем. Ин аст рамзи барнома: |^
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);

   }
}
Натиҷаи барнома чунин аст:

a & b = 16
a | b = 121
a ^ b = 105
Агар шумо намефаҳмед, ки чӣ рӯй дода истодааст, натиҷа хеле ва хеле пурасрор менамояд. Дар асл, ҳама чиз осонтар аз он аст, ки ба назар мерасад. Операторҳои бинавӣ рақамҳои операндро дар шакли дуӣ "мебинанд". Ва он гоҳ онҳо операторҳои мантиқӣ &ё ба рақамҳои |( ^битҳои) мувофиқи ҳарду рақамро истифода мебаранд. Ҳамин тавр, барои &битҳои охирини тасвири дуӣ рақами 25 мантиқӣ ба битҳои охирини муаррифии дуӣ рақами 112, бит аз охирин бо як пеш аз охирин ва ғайра ҷамъ мешавад: Амалиёти мантиқӣ дар Java.  Амалиётҳои битвӣ дар Java - 4Ҳамин мантиқро метавон дар ҳолати |ва ^. Амалиёти мантиқӣ дар Java.  Амалиётҳои битвӣ дар Java - 5

Битта ба чап ё рост гузаред

Дар Java якчанд операторҳои гузариш вуҷуд доранд. Операторҳои бештар истифодашаванда <<ва мебошанд >>. Онҳо тасвири дуии ададро мутаносибан ба чап ё рост ва дар ҳолати гузаштан ба рост, ҳангоми нигоҳ доштани аломат (мо дар зер мефаҳмонем, ки нигоҳ доштани аломат чӣ маъно дорад). Боз як оператори сменаи рост вуҷуд дорад >>>. Он ҳамон корро мекунад, аммо >>аломатро захира намекунад. Пас, биёед бо мисол кори онҳоро дида бароем. int a = 13 a << 1ҳамаи битҳои намоиши дуии адади a-ро ба чап ба 1 бит мекӯчонад. Барои содда кардан, биёед рақами 13-ро дар шакли дуӣ 0000 1101 муаррифӣ кунем. Дар асл ин рақам чунин менамояд: 00000000 00000000 00000000 00001101, зеро Java intбарои рақамҳо 4 byte ё 32 бит ҷудо мекунад. Аммо, ин дар мисол нақш намебозад, бинобар ин мо дар ин мисол рақами худро як byte ҳисоб мекунем. Амалиёти мантиқӣ дар Java.  Амалиётҳои битвӣ дар Java - 6Бита дар тарафи рост холӣ бо сифрҳо пур карда мешавад. Дар натиљаи ин амал адади 26-ро ба даст меорем. a << 2Вай њамаи битњои тасвири бинарии ададро aба тарафи чап 2 бит мегардонад ва ду бити дар тарафи рост холїшуда бо сифр пур мешавад. Дар натиҷа, мо рақами 52-ро мегирем. a << 3Дар натиҷа 104 мешавад... Ба намуна аҳамият диҳед? Гузариш ба бит aба чап ба n мавқеъ ба монанди зарб задани адад aба 2 ба қудрати n амал мекунад. Ин ба рақамҳои манфӣ низ дахл дорад. Ин -13 << 3натиҷаи -104 медиҳад. a >> nтасвири дуии як адади n мавқеъро ба рост мегардонад. Масалан, 13 >> 1 Рақами 1101-ро ба рақами 0110 табдил медиҳад, яъне 6. Ва 13 >> 2натиҷа 3 хоҳад буд. Яъне, дар ин ҷо мо ададро ба 2 ба қудрати n тақсим мекунем, ки дар он n адади баст аст. ба тарафи рост, аммо бо як огоҳӣ: агар рақам тоқ бошад, дар давоми ин амалиёт мо ба назар мерасад, ки каме охирини рақамро аз нав танзим мекунем. Аммо бо манфиҳо вазъият каме дигар аст. Биёед бигӯем, кӯшиш кунед, ки санҷед, ки барнома чӣ истеҳсол мекунад, агар шумо аз он амалеро иҷро кунед -13 >> 1. Шумо рақами -7-ро хоҳед дид, на -6, чунон ки шумо фикр мекунед. Ин бо сабаби нигоҳ доштани рақамҳои манфӣ дар Java ва дигар забонҳои барномасозӣ рӯй медиҳад. Онҳо дар он чизе, ки рамзи иловагӣ номида мешавад, нигоҳ дошта мешаванд. Дар ин ҳолат, рақами муҳимтарин (яке дар тарафи чап) дар зери аломат дода мешавад. Дар ҳолати рақами манфӣ, рақами муҳимтарин 1 аст.

Рамзи иловагӣ

Биёед рақамро баррасӣ кунем int a = 13. Агар дар барнома шумо тасвири дуии онро бо истифода аз фармон ба консол чоп кунед System.out.println(Integer.toBinaryString(a));, пас мо 1101-ро мегирем. Дар асл, ин стенография аст, зеро рақами тип intдар хотира 4 byteро ишғол мекунад, аз ин рӯ компютер онро бештар “мебинад”. монанди ин:

00000000 00000000 00000000 00001101
Рақами муҳимтарин сифр аст, ки маънои онро дорад, ки мо рақами мусбат дорем. Барои табдил додан ба рамзи иловагӣ:
  1. Мо рақами -13-ро ба ном "codeи мустақим" менависем. Барои ин рақами муҳимтарини рақамро ба 1 иваз кунед.
    Натиҷаи амал:

    
    10000000 0000000 0000000 00001101
  2. Баъдан, мо ҳама битҳоро тағир медиҳем (мо 0 ба 1 ва 1 ба 0 иваз мекунем), ба истиснои бит аломати. Дарвоқеъ, мо онро аллакай тағир додаем.
    Натиҷаи амал:

    
    11111111 11111111 11111111 11110010

    (бале, қадамҳои 1 ва 2-ро метавон якҷоя кард, аммо беҳтар аст, ки дар ин бора фикр кунед)

  3. Ба рақами натиҷавӣ 1 илова кунед.
    Натиҷаи амал:

    
    11111111 11111111 11111111 11110011
Рақами дуӣ дар натиҷа -13 аст, ки бо рамзи пурракунандаи ду навишта шудааст ва тағирёбии бит (ва дигар амалиётҳо) ба он махсус татбиқ карда мешавад. Ин танҳо он аст, ки фарқият дар мантиқи амалиёт дар ҳама амалиётҳо назаррас нест. Фарз мекунем, ки барои як гузариш ба чап, фарқият ноаён аст; мо метавонем бо рақамҳои манфӣ ҳамон тавре ки бо рақамҳои мусбат кор кунем. Акнун биёед ба рост ҳаракат кунем -13 >> 1. Азбаски оператори мо >>аломатро нигоҳ медорад, дар ин амалиёт ҳамаи битҳои аз тарафи чап озодшуда на бо сифр, балки бо якҳо пур карда мешаванд. Ҳамин тариқ, иваз кардани рақам

11111111 11111111 11111111 11110011
як бит ба рост, ки дар натиҷа пайдарпайии битҳои зерин ба вуҷуд меояд:

11111111 11111111 11111111 11111001
Агар мо ин рақамро ба рамзи мустақим табдил диҳем (яъне аввал 1-ро хориҷ кунем, баъд ҳама битҳоро ба ҷуз аз аввал баргардонем) мо рақамро мегирем:

10000000 00000000 00000000 00000111
ё -7. Акнун, ки мо оператори ивазкунандаи рости аломатро фаҳмидем, маълум хоҳад шуд, ки он аз оператор чӣ фарқ дорад >>>. a >>> n— ин амал гузариш беимзо аст, яъне тасвири дуии ададро aба n бит ба тарафи рост мегардонад, аммо n бити дар чап холйшударо на бо якхо, ба монанди оператор >>, балки бо сифр пур мекунад. Биёед амалиётро анҷом диҳем -13 >>> 1. Мо аллакай рақами -13пурраи дуро дорем:

11111111 11111111 11111111 11110011
Бо 1 бит ба тарафи рост гузаштан ва бити озодро бо сифр пур кардан, мо рақами зеринро мегирем:

01111111 11111111 11111111 11111001
Чӣ рақамро дар аломати даҳӣ медиҳад 2147483641.

Оператори радкунии битӣ ~

Ин оператори унарӣ хеле содда кор мекунад: он ҳар як бит аз намоиши бинарии ададро баръакс мекунад. Биёед рақамро гирем -13:

11111111 11111111 11111111 11110011
Амалиёти радкунии битӣ ~13танҳо арзиши ҳар як битро тағир медиҳад. Дар натиҷа мо ба даст меорем:

00000000 00000000 00000000 00001100
Ё 12дар шакли даҳӣ.

Хулосаҳои мухтасар

  • Ҳама операторҳои мантиқӣ ба ифодаҳои булӣ, яъне онҳое, ки ҳақиқӣ ё нодуруст гуфта мешаванд, татбиқ мешаванд .
  • Если операторы &, | or ^ применяются к числам, речь идёт уже не о логических операциях, а о побитовых. То есть оба числа переводятся в двоичную систему и к этим числам побитово применяют операции логического сложения, умножения or вычитания.
  • В математической логике операторам & и | соответствуют конъюнкция и дизъюнкция.
  • Логическое И похоже на умножения 1 (true) и 0 (false).
  • Логическое ИЛИ напоминает поиск максимума среди 1 (true) и 0 (false).
  • Для побитового отрицания целого числа a используется операция ~a.
  • Для логического отрицания булевского выражения a используется операция !a.
  • Отрицательные числа хранятся и обрабатываются в дополнительном codeе.
  • Поразрядный сдвиг вправо может сохранять знак (>>), а может — не сохранять (>>>).
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION