JavaRush /Java Blogu /Random-AZ /Java-da bitwise əməliyyatları

Java-da bitwise əməliyyatları

Qrupda dərc edilmişdir
Yəqin ki, “vuruş” sözü ilə tanışsınız. Yoxdursa, tanış olaq :) Bit kompüterdə informasiyanın minimum ölçü vahididir. Onun adı ingiliscə “ binary digit ” - “binary number” dan gəlir. Bit iki ədəddən biri kimi ifadə edilə bilər: 1 və ya 0. Birlərə və sıfırlara əsaslanan xüsusi say sistemi var - ikili. Biz riyaziyyat cəngəlliyinə girməyəcəyik və sadəcə qeyd edək ki, Java-da istənilən rəqəm onun ikili formasına çevrilə bilər. Bunu etmək üçün sarğı siniflərindən istifadə etməlisiniz. Bitwise əməliyyatları - 1Məsələn, bir nömrə üçün bunu necə etmək olar int:
public class Main {

   public static void main(String[] args) {

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

101010110
1010 10110 (oxumaq üçün boşluq əlavə etdim) binar sistemdə 342 rəqəmidir. Biz əslində bu ədədi fərdi bitlərə - sıfırlara və birlərə böldük. Məhz onlarla bitwise adlanan əməliyyatları yerinə yetirə bilərik.
  • ~— bit üzrə “NOT” operatoru.

O, çox sadə işləyir: nömrəmizin hər bitindən keçir və dəyərini əksinə dəyişir: sıfırları birə, birləri sıfıra. Bunu 342 rəqəmimizə tətbiq etsək, əldə etdiyimiz budur: 101010110 - binar sistemdə 342 rəqəmi 010101001 - ifadənin nəticəsi ~342 Lakin int dəyişəni 4 bayt tutduğundan, yəni. 32 bit, əslində dəyişəndəki rəqəm belə saxlanılır: 00000000 00000000 00000001 01010110- java-da int tipli dəyişəndə ​​342 rəqəmi 11111111 11111111 11111110 10101001- java-da ~342 ifadəsinin nəticəsi Bunu praktikada etməyə çalışaq:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(~x));
   }
}
Konsol çıxışı:
11111111111111111111111010101001
  • &- bit operatoru "AND"

Gördüyünüz kimi, məntiqi “VƏ” ( &&) ilə olduqca oxşar şəkildə yazılmışdır. Operator &&, xatırladığınız kimi, trueyalnız hər iki operand doğru olduqda qaytarır. Bitwise &oxşar şəkildə işləyir: iki ədədi bit-bit müqayisə edir. Bu müqayisənin nəticəsi üçüncü rəqəmdir. Məsələn, 277 və 432 rəqəmlərini götürək: 100010101 - ikilik formada 277 rəqəmi 110110000 - ikilik formada 432 rəqəmi Bundan sonra operator &yuxarı ədədin birinci bitini aşağının birinci biti ilə müqayisə edir. Bu “AND” operatoru olduğundan, nəticə yalnız hər iki bit 1-ə bərabər olduqda nəticə 1-ə bərabər olacaq. Bütün digər hallarda nəticə 0 olacaq. 100010101 & 110110000 _______________ 100010000 - işin nəticəsi & İlk olaraq ilk bitləri müqayisə edirik. bir-biri ilə iki ədəd, sonra ikinci bit, üçüncü və s. Gördüyünüz kimi, yalnız iki halda ədədlərin hər iki biti 1-ə bərabər idi (birinci və beşinci bit). Bütün digər müqayisələrin nəticəsi 0 oldu. Buna görə də sonda 100010000 rəqəmini aldıq. Onluq sistemdə o, 272 rəqəminə uyğun gəlir. Yoxlayaq:
public class Main {

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

272
  • |- bit istiqamətində "YA". Əməliyyat prinsipi eynidir - iki ədədi bit-bit müqayisə edirik. Yalnız indi bitlərdən heç olmasa biri 1-ə bərabər olarsa, nəticə 1-ə bərabər olacaq. Gəlin eyni rəqəmlərə - 277 və 432-yə baxaq:
100010101 | 110110000 _______________ 110110101 - işin nəticəsi | Burada nəticə fərqlidir: yalnız hər iki ədəddə sıfır olan bitlər sıfır olaraq qaldı. İşin nəticəsi 110110101 rəqəmidir. Onluq sistemdə 437 rəqəminə uyğundur. Yoxlayaq:
public class Main {

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

437
Hər şeyi düzgün hesabladıq! :)
  • ^- bit üzrə eksklüziv OR (həmçinin XOR kimi tanınır)
Biz əvvəllər belə operatorla rastlaşmamışıq. Ancaq burada mürəkkəb bir şey yoxdur. Adi "və ya" kimi görünür. Fərq birdir: trueən azı bir operand doğru olarsa, adi “və ya” qaytarır. Amma mütləq biri deyil - hər ikisi varsa true- nəticə true. Ancaq eksklüziv "və ya" trueyalnız operandlardan biri doğru olduqda qaytarılır. Hər iki operand doğrudursa, adi “və ya” qayıdacaq true(“ən azı biri doğrudur”), lakin eksklüziv və ya qayıdacaq false. Buna görə eksklüziv adlanır. Əvvəlki bit əməliyyatlarının prinsipini bilməklə, yəqin ki, 277^432 əməliyyatını özünüz asanlıqla yerinə yetirə bilərsiniz. Ancaq gəlin bunu bir daha birlikdə anlayaq :) 100010101 ^ 110110000 _______________ 010100101 - işin nəticəsi ^ Budur nəticəmiz. Hər iki ədəddə eyni olan bitlər 0 qaytardı (“bir” düsturu işləmədi). Amma 0-1 və ya 1-0 cütünü meydana gətirənlər sonda vahidə çevrildi. Nəticədə 010100101 rəqəmini əldə etdik. Onluq sistemdə 165 rəqəminə uyğundur. Görək düzgün hesablamışıqmı:
public class Main {

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

165
Super! Hər şey tam düşündüyümüz kimidir :) İndi bit sürüşmə adlanan əməliyyatlarla tanış olmaq vaxtıdır. Ad, prinsipcə, özü üçün danışır. Bir neçə ədəd götürüb onun bitlərini sola və sağa hərəkət etdirəcəyik :) Gəlin görək necə görünür:

Sola sürüşdürün

Bitlərin sola sürüşməsi işarə ilə göstərilir << .
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));
   }
}
Bu nümunədə nömrə x=64dəyər adlanır. Biz dəyişəcəyimiz onun hissələridir. Bitləri sola keçirəcəyik (bu işarənin istiqaməti ilə müəyyən edilə bilər <<) İkili sistemdə 64 ədədi = 1000000 ədədə y=3kəmiyyət deyilir. Miqdar “ədədin bitləri neçə bit sağa/sola sürüşdürülməlidir x?” sualına cavab verir, nümunəmizdə onları 3 bit sola keçirəcəyik. Növbə prosesini daha aydın etmək üçün şəklə baxaq. Nümunəmizdə int tipli nömrələrdən istifadə edirik. Int32 bit kompüter yaddaşını tutur. İlkin 64 rəqəmimiz belə görünür: Bitwise əməliyyatları - 2İndi biz, sözün hərfi mənasında, hər bir bitimizi götürüb 3 xana ilə sola sürüşdürürük: Bitwise əməliyyatları - 3Əldə etdiyimiz budur. Gördüyünüz kimi, bütün bitlərimiz dəyişdi və diapazondan kənardan daha 3 sıfır əlavə edildi. 3 - çünki biz 3-ə dəyişirdik. 10-a köçürsək, 10 sıfır əlavə olunacaqdı. Beləliklə, ifadə x << y"y ədədi xananın bitlərini хsola sürüşdürmək" deməkdir. İfadəmizin nəticəsi onluq sistemdə 512-yə bərabər olan 1000000000 ədədi oldu. Yoxlayaq:
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 çıxışı:

512
Düzdür! Nəzəri olaraq, bitlər qeyri-müəyyən müddətə dəyişdirilə bilər. Amma bizdə nömrə olduğundan intcəmi 32 xana mövcuddur. Bunlardan 7-si artıq 64 (1.000.000) sayı ilə məşğuldur. Buna görə də, məsələn, sola 27 yerdəyişmə etsək, yeganə vahidimiz diapazondan kənara çıxacaq və “üzerinə yazacaq”. Yalnız sıfırlar qalacaq!
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 çıxışı:

0
Gözlədiyimiz kimi, biri 32 bitlik hüceyrələrdən kənara çıxdı və yox oldu. Yalnız sıfırlardan ibarət 32 bitlik nömrə əldə etdik. Bit istiqamətində əməliyyatlar - 4Təbii olaraq onluq sistemdə 0-a uyğundur.Sola sürüşmələri yadda saxlamaq üçün sadə qayda: Hər sola sürüşmə ilə ədəd 2-yə vurulur.Məsələn,şəkilsiz ifadənin nəticəsini bitlərlə hesablamağa çalışaq.Bizə 111111111 << 3 lazımdır . 111111111 rəqəmini 2-yə üç dəfə vurmaq.Nəticədə 888888888 əldə edirik. Kodu yazıb yoxlayaq:
public class Main {

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

888888888

Sağ sürüşmələr

Onlar işarə ilə göstərilir >>. Eyni şeyi edirlər, yalnız başqa istiqamətdə! :) Gəlin təkəri yenidən kəşf etməyək və bunu eyni sayda int 64 ilə etməyə çalışaq.
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);
   }
}
Bitwise əməliyyatları - 5Bitwise əməliyyatları - 62 sağa sürüşmə nəticəsində nömrəmizin iki həddindən artıq sıfırı diapazondan kənara çıxdı və silindi. Onluq sistemdə 16 rəqəminə uyğun gələn 10000 rəqəmini aldıq. Konsola çıxış:

16
Sağa sürüşmələri xatırlamaq üçün sadə bir qayda: Hər bir sağa sürüşmə ikiyə bölünür və hər hansı bir qalıq atılır. Məsələn, 35 >> 2 bu o deməkdir ki, biz 35-i 2-yə 2 dəfə bölmək, qalanı atmaqla 35/2 = 17(qalıq 1-i atmaqla) 17:2 = 8(qalıq 1-i atmaqla) cəmi 35 >> 28-ə bərabər olmalıdır. Yoxlayın:
public class Main {

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

8

Java-da əməliyyatların üstünlüyü

Kod yazarkən və ya oxuduqca tez-tez bir neçə əməliyyatın eyni vaxtda yerinə yetirildiyi ifadələrlə rastlaşacaqsınız. Onların hansı ardıcıllıqla yerinə yetiriləcəyini anlamaq çox vacibdir, əks halda nəticə gözlənilməz ola bilər. Java-da çoxlu əməliyyatlar olduğundan, onların hamısı xüsusi cədvələ ayrılmışdır:

Operatorun üstünlüyü

Operatorlar Birincilik
postfiks expr++ expr--
unar ++expr --expr +expr ~ !
Multiplikativ * / %
əlavə + -
yerdəyişmə << >> >>>
əlaqəli < > <= >=misal
bərabərlik == !=
bitlə VƏ &
bitwise eksklüziv OR ^
bitwise daxil OR |
məntiqi VƏ &&
məntiqi OR ||
üçlü ? :
tapşırıq = += -= *= /= %= &= ^= |= <<= >>= >>>=
Bütün əməliyyatlar soldan sağa, lakin onların prioriteti nəzərə alınmaqla həyata keçirilir. Məsələn, yazsaq: int x = 6 - 4/2; əvvəlcə bölmə əməliyyatı (4/2) yerinə yetiriləcək. O, ikinci sırada olsa da, daha çox üstünlük təşkil edir. Mötərizələr və ya kvadrat mötərizələr istənilən prioriteti maksimuma dəyişir. Yəqin ki, bunu məktəbdən xatırlayırsınız. Məsələn, onları ifadəyə əlavə etsəniz: int x = (6 - 4)/2; mötərizədə hesablandığı üçün çıxma əvvəlcə yerinə yetiriləcək. &&Cədvəldən göründüyü kimi məntiqi operator kifayət qədər aşağı prioritetə ​​malikdir . Buna görə də, çox vaxt sonuncu icra ediləcək. Məsələn: boolean x = 6 - 4/2 > 3 && 12*12 <= 119; Bu ifadə belə yerinə yetiriləcək:
  • 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;
  • Sonra müqayisə operatorları yerinə yetiriləcək:

    4 > 3 = true

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

    boolean x = true && false;
  • Və nəhayət, sonuncu operator icra ediləcək &&.

    boolean x = true && false;

    boolean x = false;

    Əlavə operatoru ( +), məsələn, müqayisə operatorundan daha yüksək üstünlüyə malikdir !=(“bərabər deyil”);

    Buna görə də ifadədə:

    boolean x = 7 != 6+1;

    əvvəlcə 6+1 əməliyyatı yerinə yetiriləcək, sonra yoxlama 7!=7 (yanlış) və sonda nəticə dəyişənə təyin falseolunacaq x. Tapşırıq ümumiyyətlə bütün əməliyyatlar arasında ən aşağı prioritetə ​​malikdir - cədvələ baxın.

vay! Mühazirəmiz uzun idi, amma siz bunu bacardınız! Əgər siz bu və əvvəlki mühazirələrin bəzi hissələrini tam başa düşmürsünüzsə, narahat olmayın, biz bu mövzulara gələcəkdə bir neçə dəfə toxunacağıq. Budur sizin üçün bəzi faydalı linklər:
  • Məntiqi Operatorlar - JavaRush proqramında məntiqi əməliyyatlar üzrə mühazirə. Tezliklə onlara çatmayacağıq, amma indi oxuya bilərsiniz, heç bir zərəri olmayacaq
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION