JavaRush /Блоги Java /Random-TG /Java: битҳо ва байтҳо
Viacheslav
Сатҳи

Java: битҳо ва байтҳо

Дар гурӯҳ нашр шудааст
Java: битҳо ва byteҳо - 1

Муқаддима

Агар одамон дар системаи ададҳои даҳӣ ҳисоб кунанд, пас компютерҳо дар системаи дуӣ ҳисоб мекунанд. Ва барномасоз бояд фаҳмад, ки чӣ тавр ҳам бо одамон ва ҳам бо компютер сӯҳбат кардан мумкин аст. Ин барраси бояд дар ин масъала кӯмак кунад. Баъзан дар паси чизи аён як ҷаҳони пурра пинҳон аст. Ман пешниҳод мекунам, ки дар бораи ин ҷаҳон сӯҳбат кунам. Масалан, дар як ҳафта 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), компютерҳо дар дуӣ (яъне пойгоҳи 2) ҳисоб мекунанд. Аммо қоидаҳое, ки дар ин системаҳои рақамӣ татбиқ мешаванд, якхелаанд.
Java: битҳо ва byteҳо - 4

Системаи дуӣ

Системаи дуӣ ба системаи даҳӣ хеле монанд аст, танҳо фарқият дар он аст, ки маҳдудият дар ин ҷо 10 не, балки 2 аст. Биёед бо як мисол муқоиса кунем. Чӣ тавр мо 11-ро дар дуӣ муаррифӣ мекунем? Ин хеле содда аст: шумо танҳо бояд адади даҳиро ба асоси 2 тақсим кунед, яъне 11/2-ро дар сутун ҳисоб кунед. Мисол:
Java: битҳо ва byteҳо - 5
Ё ин аст як мисол аз WikiHow:
Java: битҳо ва byteҳо - 6
Ҷолиб он аст, ки мо метавонем ададро дар адади дуӣ ҳамон тавре ки дар адади даҳӣ муаррифӣ кунем: 111 дар дуӣ = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: битҳо ва byteҳо - 7
Намунаи табдor дуӣ ба даҳиро дар ҳисобкунаки онлайн дидан мумкин аст . Дар бораи як будани коидахои кор дар системахои шумора сухан ронда, ба чамъ кардан дар системаи дуй назар мекунем:
Java: битҳо ва byteҳо - 8
Тавре ки шумо мебинед, мо рақамҳоро ҳангоми ҷамъкунӣ ҳамон тавре ки дар системаи даҳӣ интиқол медиҳем. Таҳлor иловаро, масалан, дар ин ҷо дидан мумкин аст: Зимнан, баъзе калимаҳои «разряд» давра ба давра зикр мешаванд. Ва он чӣ аст? Ҷой танҳо як "унсури сохтории" ифодакунандаи адад аст. Яъне рақами 10 аз ду рақам иборат аст: барои навиштани ин адад ба мо 2 рақам, 2 ҷой, 2 элемент лозим аст. Барои мо фаҳмидани ин муҳим аст, зеро дар системаи шумораҳои дуӣ рақам як каме аст . Калимаи Bit аз забони англисии "binary digit" , яъне рақами дуӣ меояд. Он метавонад ё 0 ё 1 бошад. Аммо ҳамон тавре ки мо рақамҳо ва калимаҳоро дар маҷмӯъ мехонем, на ҳарф ба ҳарф, компютерҳо як битро дар як вақт намехонанд. Барои ҳадди ақали "порчаи" иттилооти коркардшуда дар RAM (ба истилоҳ хурдтарин воҳиди addressшавандаи иттилоот), пайдарпаии 8 бит хонда мешавад . Азбаски 8-тои онҳо вуҷуд доранд, онро "октет" меноманд. Ва инчунин - калимаи маъруфи Байт . Барои ба ёд овардани октет, шумо метавонед дар хотир доред, ки калимаи ҳаштпо (ҳашт по) ба забони англисӣ ҳамчун ҳаштпо тарҷума шудааст. Яъне, дар ин сарлавҳа маҳз ҳамон "окто" аст:
Java: битҳо ва byteҳо - 9
Биёед фикр кунем, ки шумораи максималии мо ҳамчун 8 бит чӣ гуна аст?
Java: битҳо ва byteҳо - 10
Ва дар ин ҷо савол ба миён меояд: дар бораи рақамҳои манфӣ чӣ гуфтан мумкин аст? Барои фаҳмидани ин, биёед дар бораи чӣ гуна byteҳо дар Java муаррифӣ карда мешаванд, сӯҳбат кунем
Java: битҳо ва byteҳо - 11

Java ва byte

Чӣ тавр мо метавонем рақамҳои манфиро дар Java истифода барем? Он оддӣ карда шудааст. Дар Java, byteҳо имзо карда мешаванд. Рақами/бити чапи чап (инчунин "бити муҳимтарин" номида мешавад) як навъ "маркер" сохта шудааст, ки ба саволи "Оё ин рақам манфӣ аст?" Агар ҷавоб ҳа бошад, пас маркер арзиши 1 дорад. Дар акси ҳол, он 0 аст. Биёед мисоли ба рақами манфии 5 табдил додани рақами 5-ро дида бароем:
Java: битҳо ва byteҳо - 12
Дар асоси ин расм, шумо метавонед маҳдудиятҳоеро фаҳмед, ки дар он арзиши byte ҷойгир аст:
Java: битҳо ва byteҳо - 13
Инчунин равшан аст, ки:
  • агар якро ба 127 илова кунем, мо -128 мегирем.
  • агар аз -128 як кам кунем, 127 мебароем.
Ҳамин тариқ, Байт дар Java метавонад аз -128 то 127 арзиш гирад. Тавре ки мо дар хотир дорем, byte як октет аст. Ва рақами максималӣ/бита муҳимтарин рақами силсилавии 7 дорад, зеро мо аз сифр ҳисоб мекунем. Дар ин њолат ба осонї дар хотир доштан мумкин аст, ки як byte ба -2 ба ќудрати 7 (њадди поён) ба 2 ба ќувваи 7 минуси 1 (њадди боло) баробар аст. Кор бо навъи додаҳо оддӣ аст. Мо барои ин мақола компилятори онлайни Java "repl.it" -ро ҳамчун "қуттии қум" истифода мебарем. https://repl.it/languages/java. Масалан, биёед codeеро иҷро кунем, ки тағирёбандаи byteро дар шакли дуӣ ҳамчун сатр муаррифӣ кунад:
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);
  }
}
Кор бо byteҳо ҳангоми кор бо ҷараёнҳои I/O фаъол истифода мешавад. Шумо метавонед маълумоти бештарро дар дастури Oracle хонед: " Ҷараёни I/O ". Илова бар ин, дар Java шумо метавонед як литерали махсусро барои муайян кардани арзиш ҳамчун бит истифода баред:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: битҳо ва byteҳо - 14

Манипуляцияи бит

Ба byteҳо ва битҳо дахл карда, аз манипуляцияҳои гуногуни бит ёдовар шудан мумкин нест. Эҳтимол, амалиёти маъмултарин ин сменаҳо мебошад (басомади битӣ ё бит-гузариш). Ва ҳама аз он сабаб, ки натиҷаи онҳо манфиатҳои равшани амалӣ дорад. Чӣ фоида? Гузариш ба чап ба N мавқеъ ба зарб задани адад ба 2N баробар аст. Ва гузариш ба тарафи рост ба ҳамон тақсимот монанд аст.Ҳамин тавр, 5<<2 == 5*Math.pow(2,2) Ва барои фаҳмидани он ки чаро ин тавр аст, биёед ба ин мисол муфассалтар назар андозем:
Java: битҳо ва byteҳо - 15
Инкори битвии НЕСТ (Unary bitwise), ки бо тилда ифода мешавад, битҳоро инверт мекунад. Он ҳамчун тилда навишта шудааст, масалан ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Ин бори дигар нишон медиҳад, ки вақте Java аломати ададро иваз мекунад, ба ғайр аз тағир додани арзишҳои бит дар ниҳоят, мо +1 -ро иҷро мекунем. Ва бе ин, чунон ки мебинем, шумораи мо 5 дигар мешавад. Ва барои он ки он ҳамон рақами пеш аз тағир додани аломат боқӣ монад, шумо бояд +1 кунед. Битва ба шумо имкон медиҳад, ки ду рақами гуногунро бо арзиши 1 каме танҳо дар сурате тарк кунед, ки ҳамаи битҳо арзиши як дошта бошанд. Чизи ҷолиб дар ин метавонад он бошад, ки он дорои баъзе манфиатҳои барнома мебошад:
int x=4;
System.out.println((x&1) != 1);
Ин code рақами x-ро барои баробарӣ тафтиш мекунад. Биёед як мисолро дида бароем:
Java: bits and bytes - 16
Бо истифода аз Bitwise AND ва Bitwise OR якҷоя, шумо метавонед ниқобҳоро истифода баред:
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 намуди ибтидоӣ мавҷуданд. Навъи ибтидоӣ як навъи додаҳост, ки дар забони барномасозӣ сохта шудааст, яъне бо нобаёнӣ дастрас аст. byte хурдтарин навъи додаҳои ибтидоӣ аз нигоҳи изофаи хотира аст, ки Java метавонад бо он кор кунад. Тавре ки қаблан гуфта будем, як byte 8 битро мегирад. Аз ин рӯ, рақами муҳимтарин рақами 7 мебошад. Аз ин рӯ, byte дорои арзишҳо аз -2 то 7-ум то 2 то 7-ум минуси 1-и натиҷа аст. Кадом намудҳои дигари ибтидоӣ вуҷуд доранд:
Java: bits and bytes - 17
Тавре ки мо аз ҷадвал мебинем, намудҳои додаҳо аз рӯи миқдори маълумотҳои ишғолшуда ду баробар зиёд мешаванд. Яъне кӯтоҳ = 2 * byte ва int = 2 * кӯтоҳ. Дар асл ба ёд овардан осон аст. Дар хотир доред, ки byte = 8 бит. Кам шуданаш мумкин нест, низ ба хотир меояд. Дар забони англисӣ, адад бутун номида мешавад. Навъи ибтидоиро аз он ихтисораи int меномиданд. Як адади муқаррарӣ мавҷуд аст - int. Як варианти кӯтоҳ, кӯтоҳ ва versionи дароз, дароз аст. Мутаносибан, int 32 бит (4 byte) ишғол мекунад. Варианти кӯтоҳ 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 навъи ибтидоӣ булӣ аст. boolean як навъи маълумоти мантиқист, ки танҳо ду арзиш дорад: ҳақиқӣ ва бардурӯғ. Аммо савол ба миён меояд - он чӣ андоза аст? Мушаххасоти мошини виртуалии Java ва бахши " 2.3.4. Навъи логикӣ " ба мо ҷавоб медиҳад:
Java: bits and bytes - 18
Яъне, танҳо як булӣ ҳамон миқдорро ҳамчун int мегирад. Агар мо массиви логикиро эълон кунем, он гоҳ ҳар як элементи массив 1 byteро ишғол мекунад. Инҳо мӯъҷизаҳоянд :)

Хулоса

Ман тавсия медиҳам, ки шумо бо якчанд маводи дигар шинос шавед, то онҳоро муттаҳид кунед: #Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION