Java: bit və bayt - 1

Giriş

İnsanlar onluq say sistemində sayırlarsa, kompüterlər də ikilik sistemdə sayılır. Proqramçı isə həm insanlarla, həm də kompüterlərlə necə danışacağını başa düşməlidir. Bu baxış bu məsələdə kömək etməlidir. Bəzən aşkar olanın arxasında bütöv bir dünya gizlənir. Mən bu dünya haqqında danışmağı təklif edirəm. Məsələn, həftədə 7 gün var. İndi suala cavab verək: “7” rəqəmi nədir? ) Birincisi, o, tam (müsbət) natural ədəddir. Bu həm də onluq ədəddir. Onluq ədəd Ondalıq Sistemdəki bir ədəddir. “Onluq say sistemi” dedikdə, say sisteminin 10 bazası olduğunu bildirir . Radiks verilmiş say sistemində ədədi təmsil etmək üçün neçə rəqəmdən istifadə oluna biləcəyini göstərir. Geri sayım sıfırdandır. Müvafiq olaraq, onluq say sistemində ədədləri təmsil etmək üçün biz 0-dan 9-a qədər olan rəqəmlərdən istifadə edirik. Bu yaxşıdır, lakin biz təkcə 9-a qədər deyil, həm də ondan sonra da saymalıyıq. Necə olmaq? Məsələn, 10 rəqəmi. Bu rəqəmi yazmaq üçün 2 rəqəmdən çox istifadə edirik. Onluq sistemdə hər bir rəqəmin yeri onluq yer adlanır. Rəqəmlər sağdan sola hesablanır:
Java: bit və bayt - 2
Bundan əlavə, onluq ədədi aşağıdakı kimi genişləndirilə bilər: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: bit və bayt - 3
Sayı əsasən sağdan sola artır. Yəni əvvəlcə 7 idi, sonra isə 10 oldu.Ona görə də rəqəmlər sıfırdan başlayaraq sağdan sayılır. Bütün bunlar nə üçündür? Bunun səbəbi biz kompüter deyilik. Və biz onluq (yəni 10 bazası) saydığımız halda, kompüterlər ikilik sistemdə (yəni 2-ci baza) sayılır. Amma bu say sistemlərində tətbiq olunan qaydalar eynidir.
Java: bit və bayt - 4

Binar sistem

İkilik sistem onluq sistemə çox bənzəyir, yeganə fərq buradakı limitin 10 deyil, 2 olmasıdır. Bir misalla müqayisə edək. 11-i binar sistemdə necə təmsil edirik? Çox sadədir: sadəcə onluq ədədi 2 bazasına bölmək lazımdır, yəni bir sütunda 11/2 saymaq lazımdır. Misal:
Java: bit və bayt - 5
Və ya WikiHow-dan bir nümunə:
Java: bit və bayt - 6
Maraqlıdır ki, biz bir ədədi onluq sistemdə olduğu kimi ikilik sistemdə də təmsil edə bilərik: binar sistemdə 111 = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: bit və bayt - 7
Onlayn kalkulyatorda ikilikdən onluğa çevrilmə nümunəsini görmək olar . Say sistemlərində işləmə qaydalarının eyni olmasından danışarkən ikilik sistemdə toplamaya baxaq:
Java: bit və bayt - 8
Gördüyünüz kimi, toplama zamanı rəqəmləri onluq sistemdəki kimi köçürürük. Əlavənin təhlilini, məsələn, burada görmək olar: Yeri gəlmişkən, vaxtaşırı bəzi "boşaltma" sözü qeyd olunur. Və bu nədir? Yer sadəcə rəqəmi təmsil edən “struktur elementdir”. Yəni 10 rəqəmi iki rəqəmdən ibarətdir: bu rəqəmi yazmaq üçün bizə 2 rəqəm, 2 yer, 2 element lazımdır. Bunu başa düşmək bizim üçün vacibdir , çünki ikili say sistemində rəqəm bir azdır . Bit sözü ingilis dilindən gəlir "binary digit" , yəni ikili rəqəm. Bu, ya 0, ya da 1 ola bilər. Amma biz rəqəmləri və sözləri hərf-hərf yox, bütöv oxuduğumuz kimi, kompüterlər də bir bit oxumur. RAM-da işlənmiş məlumatın minimum "parçası" üçün (ən kiçik ünvanlı məlumat vahidi adlanır) 8 bitlik ardıcıllıq oxunur . Onlardan 8-i olduğu üçün buna “oktet” deyilir. Həm də - daha çox tanınan söz Bayt . Okteti xatırlamaq üçün ahtapot (səkkiz ayaq) sözünün ingilis dilinə ahtapot kimi tərcümə olunduğunu xatırlaya bilərsiniz. Yəni, başlıqdakı eyni "okto" budur:
Java: bit və bayt - 9
Gəlin düşünək, 8 bit kimi təmsil edə biləcəyimiz maksimum ədəd nə qədərdir?
Java: bit və bayt - 10
Və burada sual yaranır: mənfi ədədlər haqqında nə demək olar? Bunu başa düşmək üçün Java-da baytların necə təmsil olunduğundan danışaq
Java: bit və bayt - 11

Java və Bayt

Java-da mənfi ədədlərdən necə istifadə edə bilərik? Sadəcə olaraq edilir. Java-da baytlar imzalanır. Ən soldakı rəqəm/bit (həmçinin “ən əhəmiyyətli bit” adlanır) “Bu rəqəm mənfidirmi?” sualına cavab verən bir növ “marker” edilir. Cavab bəlidirsə, marker 1 dəyərinə malikdir. Əks halda, 0-dır. 5 rəqəmini mənfi 5 rəqəminə çevirmək nümunəsinə baxaq:
Java: bit və bayt - 12
Bu şəklə əsaslanaraq, Bayt dəyərinin hansı məhdudiyyətlər içərisində olduğunu başa düşə bilərsiniz:
Java: bit və bayt - 13
O da aydındır ki:
  • 127-yə bir əlavə etsək, -128 alırıq.
  • -128-dən birini çıxarsaq, 127-ni alırıq.
Beləliklə, Java-da Bayt -128-dən 127-yə qədər qiymət ala bilər. Xatırladığımız kimi, bayt oktetdir. Və maksimum rəqəm/ən əhəmiyyətli bit 7 seriya nömrəsinə malikdir, çünki biz sıfırdan sayırıq. Bu halda, bir baytın -2-yə 7-nin gücünə (aşağı hədd) 2-yə, 7-nin mənfi 1-ə (yuxarı həddi) bərabər olduğunu xatırlamaq asandır. Məlumat növü ilə işləmək sadədir. Biz bu məqalə üçün “qum qutusu” kimi “repl.it” onlayn Java kompilyatorundan istifadə edirik. https://repl.it/languages/java. Məsələn, bayt dəyişənini ikili formada sətir kimi təmsil edəcək kodu işlədək:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
I/O Streams ilə işləyərkən baytlarla işləmək fəal şəkildə istifadə olunur. Daha ətraflı Oracle-ın təlimatında oxuya bilərsiniz: " I/O Streams ". Bundan əlavə, Java-da dəyəri bit kimi təyin etmək üçün xüsusi bir hərfdən istifadə edə bilərsiniz:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: bit və bayt - 14

Bit manipulyasiyası

Baytlara və bitlərə toxunaraq, müxtəlif bit manipulyasiyalarını qeyd etməmək olmaz. Yəqin ki, ən çox görülən əməliyyat növbələrin dəyişdirilməsidir (bitwise shift və ya bit-shift). Və hamısı, çünki onların nəticəsi aydın praktik faydalara malikdir. Nə faydası var? N mövqe ilə sola keçmək ədədi 2N-ə vurmağa bərabərdir. Sağa sürüşmə isə eyni bölməyə bənzəyir.Beləliklə, 5<<2 == 5*Math.pow(2,2) Və bunun niyə belə olduğunu anlamaq üçün bu misala daha ətraflı baxaq:
Java: bit və bayt - 15
Bitwise inkarı NOT (Unary bitwise), tilde ilə təmsil olunur, bitləri tərsinə çevirir. Bu tilda kimi yazılır, məsələn ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Bu, bir daha göstərir ki, Java rəqəmin işarəsini dəyişdirəndə, bit dəyərlərini ən sonunda çevirməklə yanaşı, biz +1 həyata keçiririk. Və bu olmadan, gördüyümüz kimi, 5 nömrəmiz dəyişir. İşarəni dəyişdirməzdən əvvəl olduğu kimi eyni sayda qalması üçün +1 etməlisiniz. Bitwise AND yalnız bütün bitlərin bir dəyəri olduqda bit üçün 1 dəyəri olan iki fərqli nömrə buraxmağa imkan verir. Bunun maraqlı tərəfi onun bəzi tətbiq üstünlüklərinin olması ola bilər:
int x=4;
System.out.println((x&1) != 1);
Bu kod x rəqəmini paritet üçün yoxlayır. Bir misala baxaq:
Java: bit və bayt - 16
Bitwise AND və Bitwise OR birlikdə istifadə edərək, maskalardan istifadə edə bilərsiniz:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
Ətraflı məlumat üçün " Java-da bit operatorları ilə maskalama seçimləri "nə baxın. Bit manipulyasiyası ayrı-ayrı icmalların, məqalələrin və kitabların yazıldığı maraqlı bir mövzudur. Və buradan kriptoqrafiyaya gedən uzun yol başlayır. Bu araşdırmanın bir hissəsi olaraq bunun niyə və necə işlədiyini anlamağa dəyər. Bit əməliyyatları haqqında daha çox məlumat üçün tproger-dən rəyi oxumağı məsləhət görürəm: “ Bit əməliyyatları haqqında .”

İbtidai növlər

Deməli, bayt oktetdir, yəni 8 bitdir. Yadda saxlamaq asandır ki, Java-da təsadüfən 8 primitiv tip var. Primitiv tip, proqramlaşdırma dilinə daxil edilmiş, yəni standart olaraq mövcud olan məlumat növüdür. bayt Java-nın işləyə biləcəyi yaddaş izi baxımından ən kiçik primitiv məlumat növüdür. Daha əvvəl dediyimiz kimi, bir bayt 8 bit yer tutur. Buna görə də, ən əhəmiyyətli rəqəm 7 rəqəmidir. Buna görə bayt nəticənin -2-dən 7-ci gücünə qədər 2-dən 7-ci gücünə qədər olan dəyərləri ehtiva edir. Başqa hansı primitiv növlər var:
Java: bit və bayt - 17
Cədvəldən gördüyümüz kimi, məlumat növləri tutduqları məlumatların miqdarı baxımından iki dəfə artır. Yəni qısa = 2 * bayt və int = 2 * qısa. Əslində xatırlamaq asandır. Unutmayın ki, bayt = 8 bitdir. Bundan az ola bilməyəcəyi də xatırlanır. İngilis dilində tam ədədə tam ədəd deyilir. Ondan olan primitiv tip int abbreviaturası adlanırdı. Daimi tam ədəd var - int. Qısa variantı var, qısa və uzun variantı uzun. Müvafiq olaraq, int 32 bit (4 bayt) tutur. Qısa versiya 2 dəfə kiçikdir - 16 bit (2 bayt), uzun versiya isə iki dəfə böyükdür, yəni. 64 bit (8 bayt). Beləliklə, bir int ən çox təxminən 2 milyard yüz milyon ədəd saxlaya bilər. Və uzun müddət maksimum təxminən 9 katrilyon saxlaya bilər (gözəl söz). Təcrübəsiz bir proqramçının kilobaytda 1000 bayt olduğunu və tam bir proqramçının kiloqramda 1024 qram olduğuna inanması ilə bağlı köhnə zarafatı xatırlasaq, başa düşə bilərik:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
Yeri gəlmişkən, diqqətli oxucu, şəkildə cəmi 7 növ olduğunu fərq edə bilər. 8 primitiv tip booleandır. boolean yalnız iki dəyəri olan bir Boolean məlumat növüdür: doğru və yanlış. Ancaq sual yaranır - onun ölçüsü nədir? Java Virtual Maşının Xüsusiyyəti və " 2.3.4. Boolean Tip " bölməsi bizə cavab verəcək:
Java: bit və bayt - 18
Yəni, sadəcə bir boolean int ilə eyni məbləği alacaq. Boolean massivi elan etsək, massivin hər bir elementi 1 bayt tutacaq. Bunlar belə möcüzələrdir :)

Nəticə

Birləşdirmək üçün daha bir neçə materialla tanış olmağı təklif edirəm: #Viaçeslav