JavaRush /Java блогу /Random-KY /Java: бит жана байт
Viacheslav
Деңгээл

Java: бит жана байт

Группада жарыяланган
Java: бит жана byte - 1

Киришүү

Эгерде адамдар ондук системада санаса, анда компьютерлер экorк системада эсептешет. Ал эми программист адамдар менен да, компьютерлер менен да сүйлөшүүнү түшүнүшү керек. Бул карап чыгуу бул маселеде жардам бериши керек. Кээде ачык нерсенин артында бүтүндөй бир дүйнө катылган. Мен бул дүйнө жөнүндө сүйлөшүүнү сунуштайм. Мисалы, бир жумада 7 күн бар. Эми суроого жооп берели: "7" деген эмне? ) Биринчиден, бул бүтүн (оң) натурал сан. Ошондой эле ондук сан болуп саналат. Ондук сан - ондук системадагы сан. Биз "ондук санауу системасы" деп айтканда, бул сан системасынын 10 базасы бар экенин билдирет . Радикс бир санды көрсөтүү үчүн берилген сан системасында канча цифраны колдонсо болорун көрсөтөт. Артка санак нөлдөн башталат. Демек, ондук сан системасында сандарды көрсөтүү үчүн биз 0дөн 9га чейинки сандарды колдонобуз. Бул жакшы, бирок биз 9га чейин гана эмес, андан ары да санашыбыз керек. Кантип болуш керек? Мисалы, 10 саны. Бул санды жазуу үчүн биз 2 цифраны колдонобуз. Ондук системадагы ар бир цифранын орду ондук орун деп аталат. Сандар оңдон солго карай эсептелет:
Java: бит жана byte - 2
Мындан тышкары, ондук санды төмөнкүчө кеңейтүүгө болот: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: бит жана byte - 3
Сан негизинен оңдон солго өсөт. Башкача айтканда, адегенде 7 болсо, андан кийин 10 болуп калды. Демек, цифралар нөлдөн баштап оң тараптан эсептелет. Мунун баары эмне үчүн? Себеби биз компьютер эмеспиз. Ал эми биз ондук системада (б.а. 10-базалык) санасак, компьютерлер экorк системада (б.а. 2-база) эсептешет. Бирок бул сан системаларында колдонулуучу эрежелер бирдей.
Java: бит жана byte - 4

Бинардык система

Экorк система ондук системага абдан окшош, бир гана айырмасы бул жерде чек 10 эмес, 2. Мисал менен салыштырып көрөлү. 11ди бинардык системада кантип көрсөтөбүз? Бул абдан жөнөкөй: сиз жөн гана ондук санды 2 базага бөлүшүңүз керек, башкача айтканда, тилкеде 11/2 санаңыз. Мисал:
Java: бит жана byte - 5
Же бул жерде WikiHowдан бир мисал:
Java: бит жана byte - 6
Кызыгы, биз санды ондук системадагыдай эле экorк системада көрсөтө алабыз: бинардык системада 111 = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: бит жана byte - 7
Экorктен ондукка которуунун мисалын онлайн эсептегичтен көрүүгө болот . Сан системаларында иштөө эрежелери бирдей экендиги жөнүндө айтсак, экorк системадагы кошууну карап көрөлү:
Java: бит жана byte - 8
Көрүнүп тургандай, биз кошуу учурунда цифраларды ондук системадагыдай эле өткөрөбүз. Кошуунун анализин, мисалы, бул жерден көрүүгө болот: Айтмакчы, кээ бир сөз "разряд" мезгил-мезгor менен айтылып келет. А бул эмне? Орун - бул санды көрсөтүүнүн "структуралык элементи". Башкача айтканда, 10 саны эки цифрадан турат: бул санды жазуу үчүн 2 цифра, 2 орун, 2 элемент керек. Муну түшүнүү биз үчүн маанилүү, анткени экorк санауу системасында цифра бит болот . Бит деген сөз англис тorнен келген "binary digit" , башкача айтканда, экorк сан. Ал 0 же 1 болушу мүмкүн. Бирок биз сандарды жана сөздөрдү тамга менен эмес, бүтүндөй окугандай эле, компьютерлер бирден бир бит окуbyte. RAMдагы иштетилген маалыматтын минималдуу "бөлүктөрү" үчүн (маалыматтын эң кичинекей даректүү бирдиги деп аталган) 8 биттен турган ырааттуулук окулат . Алардын саны 8 болгондуктан, бул "октет" деп аталат. Жана ошондой эле - көбүрөөк белгилүү сөз Байт . Октетти эстеп калуу үчүн, сиз октопус (сегиз бут) сөзү англис тorне октопус деп которулганын эстей аласыз. Башкача айтканда, бул жерде так ошол эле "окто" аталышында:
Java: бит жана byte - 9
Келгиле, ойлонуп көрөлү, биз 8 бит катары көрсөтө турган максималдуу сан канча?
Java: бит жана byte - 10
Бул жерде суроо туулат: терс сандар жөнүндө эмне айтууга болот? Муну түшүнүү үчүн, келгиле, Java тorнде byteтар кантип көрсөтүлөрү жөнүндө сүйлөшөлү
Java: бит жана byte - 11

Java жана byte

Кантип Java тorнде терс сандарды колдоно алабыз? Бул жөн эле жасалган. Java тorнде byteтар кол коюлган. Эң сол цифра/бит ("эң маанилүү бит" деп да аталат) "бул сан терспи?" деген суроого жооп берген "маркер" түрү болуп саналат. Эгер жооп ооба болсо, анда маркер 1 деген мааниге ээ. Болбосо, 0 болот. 5 санын терс 5ке кантип айландыруунун мисалын карап көрөлү:
Java: бит жана byte - 12
Бул сүрөткө таянып, сиз Байттык маанидеги чектерди түшүнө аласыз:
Java: бит жана byte - 13
Бул да ачык-айкын:
  • 127ге бирди кошсок, -128 болот.
  • -128ден бирди кемитсек, 127 болот.
Ошентип, Java тorнде byte -128ден 127ге чейинки маанини ала алат. Эсибизде болгондой, byte октет. Ал эми максималдуу цифра/эң маанилүү бит 7 сериялык номерге ээ, анткени биз нөлдөн баштап санайбыз. Бул учурда, бир byte -2 7дин күчү (төмөнкү чек) 2ден 7 минус 1 (жогорку чек) даражасына барабар экенин эстен чыгарбоо оңой. Маалымат түрү менен иштөө өзү жөнөкөй. Бул макала үчүн биз "repl.it" онлайн Java компиляторун "кум уячасы" катары колдонобуз. https://repl.it/languages/java. Мисалы, экorк формада byte өзгөрмөсүн сап катары көрсөтө турган codeду иштетели:
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);
  }
}
Байттар менен иштөө киргизүү/чыгаруу агымдары менен иштөөдө активдүү колдонулат. Сиз Oracle окуу куралынан көбүрөөк окуй аласыз: " I/O Streams ". Кошумчалай кетсек, Java тorнде маанини бит катары көрсөтүү үчүн атайын литералды колдоно аласыз:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: бит жана byte - 14

Бит манипуляциясы

Байттар жана биттерге токтолсок, ар кандай биттик манипуляцияларды айтпай коюуга болбойт. Кыязы, эң кеңири таралган операция бул жылыштар (бит боюнча жылдыруу же бит-жылуу). Жана баары, анткени алардын натыйжасы так практикалык артыкчылыктарга ээ. Кандай пайдасы бар? N позицияга солго жылдыруу санды 2N ге көбөйтүүгө барабар. Жана оңго жылдыруу ошол эле бөлүнүүгө окшош.Ошентип, 5<<2 == 5*Math.pow(2,2) Эмне үчүн мындай болгонун түшүнүү үчүн бул мисалды кененирээк карап көрөлү:
Java: бит жана byte - 15
Тильда менен берилген биттик четке кагуу NOT (Unary bitwise) биттерди инвертирлейт. Тильда катары жазылат, мисалы ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Бул дагы бир жолу көрсөтүп турат, качан Java сандын белгисин өзгөрткөндө, эң аягында бит маанилерин инвертирлөөдөн тышкары, биз +1 аткарабыз. Ансыз, биз көрүп тургандай, биздин 5 саны өзгөрөт. Жана ал белгини өзгөртүүгө чейинки сан бойдон калуусу үчүн +1 кылышыңыз керек. Bitwise AND бардык биттердин бир мааниси болгондо гана 1 мааниси бар эки башка санды бир азга калтырууга мүмкүндүк берет. Бул жөнүндө кызыктуу нерсе, анын кээ бир колдонуу артыкчылыктары бар болушу мүмкүн:
int x=4;
System.out.println((x&1) != 1);
Бул code x санын паритетти текшерет. Келгиле, бир мисал карап көрөлү:
Java: бит жана byte - 16
Bitwise AND жана Bitwise ЖЕ чогуу колдонуу менен, маскаларды колдоно аласыз:
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");
    }
  }
Көбүрөөк маалымат үчүн " Javaдагы биттик операторлор менен маскалоо параметрлерин " караңыз. Бит манипуляциясы өзүнчө рецензиялар, макалалар жана китептер жазылган кызыктуу тема. Жана ушул жерден криптографияга карай узун жол башталат. Бул карап чыгуунун бир бөлүгү катары, ал эмне үчүн жана кантип иштээрин түшүнүү керек. Биттик операциялар жөнүндө көбүрөөк маалымат алуу үчүн, мен tprogerден карап чыгууну сунуштайм: " Биттик операциялар жөнүндө ."

Примитивдүү түрлөрү

Демек, byte октет, башкача айтканда, 8 бит. Javaда кокустан 8 примитивдүү түрү бар экенин эстен чыгарбоо оңой. Примитивдик тип - бул программалоо тorне орнотулган, башкача айтканда, демейки боюнча жеткorктүү маалымат түрү. byte Java иштей ала турган эс тутумдун изи боюнча эң кичине примитивдүү маалымат түрү. Жогоруда айтылгандай, бир byte 8 битти ээлейт. Демек, эң маанилүү цифра 7-сан. Демек, byte жыйынтыктын -2ден 7-деңгээлге чейин 2ден 7-деңгээлге чейинки минус 1 маанилерин камтыйт. Дагы кандай примитивдүү түрлөрү бар:
Java: бит жана byte - 17
Таблицадан көрүнүп тургандай, ээлеген маалыматтардын көлөмү боюнча маалымат түрлөрү эки эсе көбөйөт. Башкача айтканда, кыска = 2 * byte, жана int = 2 * кыска. Чындыгында эстеп калуу оңой. Байт = 8 бит экенин унутпаңыз. Андан аз болушу мүмкүн эместиги да эске алынат. Англис тorнде бүтүн сан бүтүн сан деп аталат. Андан чыккан примитивдүү түрү int аббревиатурасы деп аталды. Кадимки бүтүн сан бар - int. Кыска варианты бар, кыскасы, узун versionсы узун. Демек, int 32 битти (4 byte) ээлейт. Кыска versionсы 2 эсе кичине – 16 бит (2 byte), ал эми узун versionсы эки эсе чоң, б.а. 64 бит (8 byte). Ошентип, int эң көп дегенде 2 миллиард жүз миллионго жакын санды сактай алат. Ал эми узак максималдуу болжол менен 9 квадриллион (жакшы сөз) сактай алат. Жаңы келген программист бир килоbyteта 1000 byte бар деп ойлойт, ал эми толук программист килограммда 1024 грамм бар деп эсептейт деген эски тамашаны эстеп, биз түшүнө алабыз:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
Баса, кунт коюп окурман сүрөттө 7 гана түрү бар экенин байкаса керек. 8 примитивдүү түрү логикалык. логикалык бул эки гана мааниге ээ болгон логикалык маалымат түрү: чыныгы жана жалган. Бирок суроо туулат - ал кандай өлчөмдө? Java виртуалдык машинасынын спецификациясы жана " 2.3.4. Логикалык түрү " бөлүмү бизге жооп берет:
Java: бит жана byte - 18
Башкача айтканда, жөн гана логикалык инт менен бирдей сумманы алат. Эгерде биз логикалык массивди жарыяласак, анда массивдин ар бир элементи 1 byteты ээлейт. Бул кереметтер :)

Корутунду

Консолидациялоо үчүн дагы бир нече материалдар менен таанышууну сунуштайм: #Вячеслав
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION