JavaRush /Блоги Java /Random-TG /Амалиётҳои битвӣ дар Java

Амалиётҳои битвӣ дар Java

Дар гурӯҳ нашр шудааст
Эҳтимол шумо бо калимаи "лат" шинос ҳастед. Агар не, биёед бо он шинос шавем :) Бит воҳиди ҳадди ақали андозагирии иттилоот дар компютер аст. Номи он аз инглисии " binary digit " - "рақами дуӣ" омадааст. Битро метавон ҳамчун яке аз ду адад ифода кард: 1 ё 0. Системаи махсуси шумораҳо вуҷуд дорад, ки ба якҳо ва сифрҳо асос ёфтааст - дуӣ. Мо ба ҷангали математика намеравем ва танҳо қайд мекунем, ки ҳар як ададро дар Java ба шакли дуӣ табдил додан мумкин аст. Барои ин ба шумо лозим аст, ки истифода синфҳои wrapper. Амалиётҳои битӣ - 1Масалан, ин аст, ки чӣ тавр онро барои рақам иҷро кунед int:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(x));
   }
}
Натиҷаи консол:

101010110
1010 10110 (ман фосила барои хондан илова кардам) рақами 342 дар дуӣ аст. Мо воқеан ин рақамро ба битҳои алоҳида тақсим кардем - сифрҳо ва якҳо. Маҳз бо онҳо мо метавонем амалиётҳоеро иҷро кунем, ки битва номида мешаванд.
  • ~— оператори битавии «НЕ».

Он хеле содда кор мекунад: вай аз ҳар як бит рақами мо мегузарад ва арзиши худро ба муқобил иваз мекунад: сифрҳо ба якҳо, якҳоро ба сифрҳо. Агар онро ба рақами 342-и худ татбиқ кунем, ин аст он чизе ки мо ба даст меорем: 101010110 - рақами 342 дар дуӣ 010101001 - натиҷаи ифодаи ~342 Аммо азбаски тағирёбандаи int 4 byte мегирад, яъне. 32 бит, дар асл, адад дар тағирёбанда чунин нигоҳ дошта мешавад: 00000000 00000000 00000001 01010110- рақами 342 дар тағирёбандаи навъи int дар java 11111111 11111111 11111110 10101001- натиҷаи ифодаи ~342 дар java Биёед кӯшиш кунем, ки ин корро дар амал иҷро кунем:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(~x));
   }
}
Натиҷаи консол:
11111111111111111111111010101001
  • &— оператори битвазни «AND»

Тавре ки шумо мебинед, он ба мантиқии "VA" ( &&) хеле монанд навишта шудааст. Оператор , тавре ки шумо дар ёд доред, танҳо дар сурати дуруст будани ҳарду операнд &&бармегардад . trueBitwise &ҳамин тавр кор мекунад: он ду ададро каме ба бит муқоиса мекунад. Натиҷаи ин муқоиса рақами сеюм аст. Масалан, рақамҳои 277 ва 432-ро мегирем: 100010101 - адади 277 дар шакли дуӣ 110110000 - адади 432 дар шакли дуӣ Минбаъд оператор бит битҳои &аввали адади болоро бо бити аввали адади поёнӣ муқоиса мекунад. Азбаски ин оператори "VA" аст, натиҷа танҳо ба 1 баробар мешавад, агар ҳарду бит ба 1 баробар бошанд. Дар ҳама ҳолатҳои дигар натиҷа 0 хоҳад буд. 100010101 & 110110000 _______________ 100010000 - натиҷаи кор & Мо аввал битҳои аввалро муқоиса мекунем аз ду адад бо ҳамдигар, баъд битҳои дуюм, сеюм ва ғайра. Тавре ки шумо мебинед, танҳо дар ду ҳолат ҳарду битҳо дар ададҳо ба 1 баробар буданд (битҳои якум ва панҷум). Натиҷаи ҳамаи муқоисаҳои дигар 0 буд. Аз ин рӯ, дар ниҳоят рақами 100010000 гирифтем. Дар системаи даҳӣ он ба рақами 272 мувофиқат мекунад. Биёед тафтиш кунем:
public class Main {

   public static void main(String[] args) {
       System.out.println(277&432);
   }
}
Натиҷаи консол:

272
  • |- ба таври бит "Ё". Принсипи кор як аст - мо ду рақамро каме муқоиса мекунем. Танҳо ҳоло агар ақаллан яке аз битҳо ба 1 баробар бошад, натиҷа ба 1 баробар мешавад. Биёед ба ҳамон рақамҳо - 277 ва 432 назар андозем:
100010101 | 110110000 _______________ 110110101 - натиљаи кор | Дар ин љо натиља дигар аст: танњо он битњое, ки дар њарду адад сифр буданд, сифр монданд. Натиҷаи кор рақами 110110101 аст. Дар системаи даҳӣ он ба адади 437 мувофиқат мекунад. Биё тафтиш мекунем:
public class Main {

   public static void main(String[] args) {
       System.out.println(277|432);
   }
}
Натиҷаи консол:

437
Мо ҳама чизро дуруст ҳисоб кардем! :)
  • ^- истисноии битвазни ё (инчунин бо номи XOR маълум аст)
Мо аз ин пеш ягон бор бо чунин оператор дучор наомадаем. Аммо дар ин бора чизи мураккабе нест. Он ба "ё" муқаррарӣ монанд аст. Фарқият як аст: "ё" муқаррарӣ бармегардад, trueагар ҳадди аққал як операнд дуруст бошад. Аммо на ҳатман як - агар ҳарду вуҷуд дошта бошанд true- пас натиҷа true. Аммо "ё" истисноӣ trueтанҳо дар сурати дуруст будани яке аз операндҳо бармегардад. Агар ҳарду операнд дуруст бошад, "ё" муқаррарӣ бармегардад true(ҳадди ақал яке дуруст аст), аммо истисноӣ ё бармегардад false. Аз ин рӯ, онро истисноӣ меноманд. Донистани принсипи амалиёти қаблии битвӣ, шумо эҳтимолан худатон амалиёти 277^432-ро ба осонӣ иҷро карда метавонед. Аммо биёед бори дигар онро якҷоя муайян кунем :) 100010101 ^ 110110000 _______________ 010100101 - натиҷаи кор ^ Ин аст натиҷаи мо. Он битҳо, ки дар ҳарду адад якхела буданд, 0-ро баргардонданд (формулаи “яке аз” кор накард). Аммо онҳое, ки ҷуфти 0-1 ё 1-0 ташкил карда буданд, дар ниҳоят ба як воҳид табдил ёфтанд. Дар натиҷа мо рақами 010100101 гирифтем. Дар системаи даҳӣ он ба рақами 165 мувофиқат мекунад. Биёед бубинем, ки оё мо дуруст ҳисоб кардаем:
public class Main {

   public static void main(String[] args) {
       System.out.println(277^432);
   }
}
Натиҷаи консол:

165
Супер! Ҳама чиз айнан ҳамон тавре аст, ки мо фикр мекардем :) Ҳоло вақти шиносоӣ бо амалиётҳое аст, ки бит смена ном дорад. Ном, аслан, барои худ сухан меронад. Мо рақамҳоро мегирем ва битҳои онро ба чап ва рост ҳаракат мекунем :) Биёед бубинем, ки он чӣ гуна аст:

Ба чап гузаред

Гузариш ба чапи битҳо бо аломати << Мисол:
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));
   }
}
Дар ин мисол, адад x=64арзиш номида мешавад. Ин қисмҳои он аст, ки мо иваз мекунем. Мо битҳоро ба тарафи чап мегузарем (инро бо самти аломат муайян кардан мумкин аст <<) Дар системаи дуӣ адади 64 = 1000000 Шумораи адад y=3миқдор номида мешавад. Миқдор ба саволи "битҳои адад бояд чанд бит ба рост/чап кӯчонида шавад x?" Дар мисоли мо, мо онҳоро 3 бит ба чап мегузарем. Барои равшантар шудани раванди смена, биёед ба расм назар андозем. Дар мисоли мо мо рақамҳои навъи int истифода мебарем. Int32 бит хотираи компютерро ишғол мекунад. Рақами аслии 64-и мо чунин аст: Амалиёти бит - 2Ва ҳоло мо, ба маънои аслии калима, ҳар як битамонро гирифта, ба тарафи чапи 3 ҳуҷайра мегузарем: Амалиёти бит - 3Ин аст он чизе ки мо гирифтем. Тавре ки шумо мебинед, ҳамаи битҳои мо иваз шуданд ва 3 сифри дигар аз берун аз диапазон илова карда шуданд. 3 - зеро ки мо ба 3 ҳаракат мекардем. Агар мо ба 10 иваз мекардем, 10 сифр илова мешуд. Ҳамин тавр, ибора x << yмаънои "кӯчонидани битҳои шумораи хячейкаҳоро ба чап" дорад. Натиҷаи ифодаи мо адади 1000000000 буд, ки дар системаи даҳӣ ба 512 баробар аст. Биёед тафтиш кунем:
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);
   }
}
Натиҷаи консол:

512
Ин дуруст аст! Дар назария, битҳоро ба таври номуайян иваз кардан мумкин аст. Аммо азбаски мо рақам дорем int, танҳо 32 ҳуҷайра мавҷуд аст. Аз ин шумора аллакай 7 ададро шумораи 64 (1 000 000) ишғол кардааст. Бинобар ин, агар мо, масалан, 27 смена ба тарафи чап кунем, ягона агрегати мо аз доираи диапазон берун баромада, «аз нав менависад». Танҳо сифрҳо боқӣ хоҳанд монд!
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);
   }
}
Натиҷаи консол:

0
Тавре ки мо интизор будем, яке аз ҳуҷайраҳои 32-бит берун рафта, нопадид шуд. Мо рақами 32-битро гирифтем, ки танҳо аз сифр иборат аст. Табиист, ки дар системаи даҳӣ он ба 0 мувофиқат мекунад.Қоидаи оддии дар хотир нигоҳ доштани гузаришҳои чап: Бо ҳар як басти чап адад ба 2 зарб карда мешавад. Масалан, биёед Амалиёти бит - 4кӯшиш кунем, ки натиҷаи ифодаро бидуни расмҳо бо битҳо ҳисоб кунем. 111111111 << 3ки адади 111111111-ро ба 2 се маротиба зарб кунем.Дар натича 888888888 ба даст меояд. Рамзро нависем ва онро санчем:
public class Main {

   public static void main(String[] args) {
       System.out.println(111111111 << 3);
   }
}
Натиҷаи консол:

888888888

Гузаришҳои рост

Онҳо бо аломати нишон дода шудаанд >>. Онҳо ҳамон корро мекунанд, танҳо дар самти дигар! :) Биёед чархро аз нав ихтироъ накунем ва кӯшиш кунем, ки ин корро бо ҳамон рақами 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);
   }
}
Амалиёти бит - 5Амалиёти бит - 6Дар натиҷаи 2 ба тарафи рост гузаштан ду сифри шадиди рақами мо берун аз диапазон баромада, нест карда шуданд. Мо рақами 10000-ро гирифтем, ки дар системаи даҳӣ ба рақами 16 мувофиқат мекунад. Баромад ба консол:

16
Қоидаи оддӣ барои дар хотир нигоҳ доштани гузаришҳои рост: Ҳар як гузариш аз рост ба ду тақсим карда, ҳама боқимондаҳоро нест мекунад. Масалан, 35 >> 2 ин маънои онро дорад, ки мо бояд 35-ро ба 2 2 маротиба тақсим кунем, боқимондаро партоем 35/2 = 17(боқимондаи 1) 17:2 = 8(партофтани боқимондаи 1) Ҳамагӣ 35 >> 2бояд ба 8 баробар бошад. Санҷед:
public class Main {

   public static void main(String[] args) {
       System.out.println(35 >> 2);
   }
}
Натиҷаи консол:

8

Афзалияти амалиётҳо дар Java

Ҳангоми навиштан ё хондани code, шумо аксар вақт бо ибораҳое дучор мешавед, ки дар онҳо якчанд амалиёт дар як вақт иҷро карда мешаванд. Фаҳмидани он, ки онҳо бо кадом тартиб иҷро карда мешаванд, хеле муҳим аст, вагарна натиҷа метавонад ғайричашмдошт бошад. Азбаски дар Java амалиётҳои зиёде мавҷуданд, ҳамаи онҳо ба ҷадвали махсус ҷудо карда шудаанд:

Афзалияти оператор

Операторон Афзалият
постфикс expr++ expr--
якранг ++expr --expr +expr ~ !
Мултипликативӣ * / %
илова + -
смена << >> >>>
муносибатӣ < > <= >=мисоли
баробарй == !=
каме ВА &
Истисноии каме OR ^
ба таври каме фарогир Ё |
мантиқӣ ВА &&
мантиқӣ Ё ||
сегона ? :
супориш = += -= *= /= %= &= ^= |= <<= >>= >>>=
Ҳама амалиётҳо аз чап ба рост, вале бо назардошти афзалияти онҳо иҷро карда мешаванд. Масалан, агар нависем: int x = 6 - 4/2; аввал амалиёти таксим (4/2) ичро мешавад. Гарчанде ки вай дар навбати дуюм аст, вай афзалияти бештар дорад. Қавсҳо ё қавсҳои мураббаъ ягон афзалиятро ба ҳадди аксар иваз мекунанд. Шояд шумо инро аз мактаб дар хотир доред. Масалан, агар шумо онҳоро ба ифода илова кунед: int x = (6 - 4)/2; тарҳи аввал иҷро карда мешавад, зеро он дар қавс ҳисоб карда мешавад. &&Чӣ тавре ки аз ҷадвал дида мешавад, оператори мантиқӣ афзалияти хеле паст дорад . Аз ин рӯ, аксар вақт он дар охир иҷро карда мешавад. Масалан: boolean x = 6 - 4/2 > 3 && 12*12 <= 119; Ин ифода чунин иҷро мешавад:
  • 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;
  • Минбаъд операторҳои муқоисавӣ иҷро мешаванд:

    4 > 3 = true

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

    boolean x = true && false;
  • Ва ниҳоят, оператори охирин иҷро карда мешавад &&.

    boolean x = true && false;

    boolean x = false;

    +Масалан, оператори изофа ( ), нисбат ба оператори муқоиса афзалияти баландтар дорад !=(“баробар нест”);

    Аз ин рӯ, дар ифода:

    boolean x = 7 != 6+1;

    аввал амалиёти 6+1 иҷро мешавад, баъд санҷиши 7!=7 (дурӯғ) ва дар охир натиҷа ба falseтағирёбанда таъин карда мешавад x. Таъинот одатан дар байни ҳамаи амалиётҳо афзалияти пасттарин дорад - ба ҷадвал нигаред.

Оҳ! Лексияи мо дароз буд, аммо шумо инро кардед! Агар шумо баъзе қисматҳои ин ва лексияҳои қаблиро пурра нафаҳмед, хавотир нашавед, мо дар оянда ба ин мавзӯъҳо на як бор дахл хоҳем кард. Инҳоянд чанд истинодҳои муфид барои шумо:
  • Операторҳои мантиқӣ - лексияи JavaRush дар бораи амалҳои мантиқӣ. Мо ба зудӣ ба онҳо намерасем, аммо шумо метавонед онҳоро ҳозир хонед, ҳеҷ зараре нахоҳад дошт
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION