JavaRush /Java блогы /Random-KK /Java тіліндегі биттік операциялар

Java тіліндегі биттік операциялар

Топта жарияланған
Сізге «соғу» сөзі таныс шығар. Егер жоқ болса, онымен танысайық :) Бит - компьютердегі ақпараттың минималды өлшем бірлігі. Оның атауы ағылшын тіліндегі « binary digit » - «binary number» сөзінен шыққан . Битті екі санның бірі ретінде көрсетуге болады: 1 немесе 0. Бірліктер мен нөлдерге негізделген арнайы санау жүйесі бар - екілік. Біз математика джунглиіне бармаймыз және Java тіліндегі кез келген санды оның екілік түріне түрлендіруге болатынын ескереміз. Бұл әрекетті орындау үшін сізге орауыш сыныптарын пайдалану керек. Биттік амалдар – 1Мысалы, сан үшін мұны қалай жасау керек int:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(x));
   }
}
Консоль шығысы:

101010110
1010 10110 (оқылуы үшін бос орын қостым) екілік жүйеде 342 саны. Біз бұл санды жеке биттерге – нөлдерге және бірліктерге бөлдік. Олармен біз разрядтық деп аталатын операцияларды орындай аламыз.
  • ~— биттік «NOT» операторы.

Ол өте қарапайым жұмыс істейді: ол біздің санымыздың әрбір битінен өтіп, оның мәнін керісінше өзгертеді: нөлдерді бірлікке, бірді нөлге өзгертеді. Егер біз оны 342 санына қолдансақ, біз мынаны аламыз: 101010110 - екілік жүйедегі 342 саны 010101001 - ~342 өрнегінің нәтижесі Бірақ int айнымалысы 4 byte алатындықтан, яғни. 32 бит, шын мәнінде айнымалыдағы сан былай сақталады: 00000000 00000000 00000001 01010110- java-дағы int түріндегі айнымалыдағы 342 саны 11111111 11111111 11111110 10101001- java-дағы ~342 өрнегінің нәтижесі Мұны тәжірибеде орындауға тырысайық:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(~x));
   }
}
Консоль шығысы:
11111111111111111111111010101001
  • &— разрядтық оператор «AND»

Көріп отырғаныңыздай, ол логикалық «ЖӘНЕ» ( &&) түріне өте ұқсас жазылған. Оператор &&, есіңізде болса, trueекі операнд да ақиқат болса ғана қайтарады. Bitwise &ұқсас жолмен жұмыс істейді: ол екі санды битпен салыстырады. Бұл салыстырудың нәтижесі үшінші сан болып табылады. Мысалы, 277 және 432 сандарын алайық: 100010101 – екілік формадағы 277 саны 110110000 – екілік формадағы 432 саны Бұдан әрі оператор &жоғарғы санның бірінші битімен төменгі санның бірінші разрядын салыстырады. Бұл «ЖӘНЕ» операторы болғандықтан, екі бит те 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«y санының ұяшықтарының биттерін хсолға жылжыту» дегенді білдіреді. Біздің өрнектің нәтижесі ондық жүйеде 512-ге тең 1000000000 саны болды. Тексерейік:
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 биттік нөмірді алдық. Биттік амалдар – 4Әрине, ондық жүйеде ол 0-ге сәйкес келеді. Солға жылжуларды есте сақтаудың қарапайым ережесі: Әрбір солға жылжу кезінде сан 2-ге көбейтіледі. Мысалы, биттермен суреттерсіз өрнектің нәтижесін есептеп көрейік 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Биттік амалдар – 62-ге оңға жылжу нәтижесінде санымыздың екі шеткі нөлі диапазоннан шығып, өшірілді. Біз ондық жүйеде 16 санына сәйкес келетін 10000 санын алдық. Консольге шығару:

16
Оң жаққа жылжуларды есте сақтаудың қарапайым ережесі: әрбір оңға жылжу екіге бөлінеді, қалған қалдығы жоқ. Мысалы, 35 >> 2 35-ті 2-ге 2-ге бөлу керек, қалғанын тастап 35/2 = 17(1-ге қалдық) 17:2 = 8(1-ге қалдық) Барлығы 35 >> 28-ге тең болуы керек. Тексеріңіз:
public class Main {

   public static void main(String[] args) {
       System.out.println(35 >> 2);
   }
}
Консоль шығысы:

8

Java тіліндегі операциялардың басымдылығы

Кодты жазу немесе оқу кезінде сіз бір уақытта бірнеше әрекеттер орындалатын өрнектерді жиі кездестіресіз. Олардың қандай ретпен орындалатынын түсіну өте маңызды, әйтпесе нәтиже күтпеген болуы мүмкін. Java-да көптеген операциялар болғандықтан, олардың барлығы арнайы кестеге бөлінген:

Оператордың басымдылығы

Операторлар Артықшылық
постфикс expr++ expr--
біртұтас ++expr --expr +expr ~ !
Мультипликативті * / %
қоспа + -
ауысым << >> >>>
қатынастық < > <= >=данасы
теңдік == !=
биттік ЖӘНЕ &
биттік эксклюзивті НЕМЕСЕ ^
биттік қосылған НЕМЕСЕ |
логикалық ЖӘНЕ &&
логикалық НЕМЕСЕ ||
үштік ? :
тапсырма = += -= *= /= %= &= ^= |= <<= >>= >>>=
Барлық операциялар солдан оңға қарай, бірақ олардың басымдылығын ескере отырып орындалады. Мысалы, былай жазсақ: 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