JavaRush /Java блогы /Random-KK /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
Екілік жүйеден ондық санау жүйесіне түрлендірудің мысалын онлайн калькулятордан көруге болады . Санау жүйелерінде жұмыс істеу ережелерінің бірдей екендігін айта отырып, екілік жүйедегі қосуды қарастырайық:
Java: бит және byte - 8
Көріп отырғаныңыздай, қосу кезінде сандарды ондық жүйедегідей тасымалдаймыз. Қосудың талдауын, мысалы, мына жерден көруге болады: Айтпақшы, «разряд» деген сөз мезгіл-мезгіл айтылады. Ал бұл не? Орын - бұл санды білдіретін «құрылымдық элемент». Яғни, 10 саны екі цифрдан тұрады: бұл санды жазу үшін бізге 2 цифр, 2 орын, 2 элемент керек. Біз үшін мұны түсіну маңызды, өйткені екілік санау жүйесінде цифр бит болып табылады . Бит сөзі ағылшын тілінен шыққан «binary digit» , яғни екілік сан. Ол 0 немесе 1 болуы мүмкін. Бірақ біз сандар мен сөздерді әріппен емес, тұтастай оқитынымыздай, компьютерлер бір уақытта бір бит оқымайды. ЖЖҚ-дағы өңделген ақпараттың ең аз «бөлігі» үшін (ақпараттың ең кіші addressтелетін бірлігі деп аталады) 8 биттік тізбек оқылады . Олардың саны 8 болғандықтан, бұл «октет» деп аталады. Сондай-ақ - ең танымал сөз Byte . Октетті еске түсіру үшін сегізаяқ (сегіз аяқ) сөзі ағылшын тіліне октопус деп аударылғанын есте ұстауға болады. Яғни, тақырыпта дәл сол «окто» бар:
Java: бит және byte - 9
Ойланайық, біз 8 бит ретінде көрсете алатын максималды сан қанша?
Java: бит және byte - 10
Және бұл жерде сұрақ туындайды: теріс сандар туралы не деуге болады? Мұны түсіну үшін Java тілінде byteтардың қалай ұсынылатыны туралы сөйлесейік
Java: бит және byte - 11

Java және byte

Java тілінде теріс сандарды қалай пайдалана аламыз? Бұл қарапайым орындалды. Java тілінде byteтарға қол қойылады. Ең сол жақ сан/бит («ең маңызды бит» деп те аталады) «Бұл сан теріс пе?» Деген сұраққа жауап беретін «маркер» түрі болып табылады. Егер жауап иә болса, онда маркер 1 мәніне ие. Әйтпесе, ол 0. 5 санын теріс 5 санына айналдырудың мысалын қарастырайық:
Java: бит және byte - 12
Осы суретке сүйене отырып, сіз byte мәні жататын шектеулерді түсіне аласыз:
Java: бит және byte - 13
Бұл да анық:
  • 127-ге бір қоссақ, -128 аламыз.
  • -128-ден біреуді алып тастасақ, 127 шығады.
Осылайша, Java тіліндегі byte -128-ден 127-ге дейінгі мәнді қабылдай алады. Біздің есімізде, byte октет болып табылады. Ал максималды сан/ең маңызды биттің сериялық нөмірі 7 болады, өйткені біз нөлден бастап санаймыз. Бұл жағдайда byte -2-ден 7-нің дәрежесіне (төменгі шек) 2-ге 7 минус 1-ге (жоғарғы шек) тең екенін есте сақтау оңай. Деректер түрімен жұмыс істеудің өзі қарапайым. Біз осы мақала үшін «құмсалғыш» ретінде «repl.it» онлайн Java компиляторын қолданамыз. https://repl.it/languages/java. Мысалы, екілік пішінде 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 тілінде мәнді бит ретінде көрсету үшін арнайы литералды пайдалануға болады:
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), биттерді инversionлайды. Ол тильда түрінде жазылады, мысалы ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Бұл тағы бір рет Java санның таңбасын өзгерткен кезде, бит мәндерін ең соңында инversionлаудан басқа, біз +1 орындайтынымызды көрсетеді. Ал онсыз, көріп отырғанымыздай, біздің 5 саны өзгереді. Ол белгіні өзгерткенге дейінгі сан болып қалуы үшін +1 жасау керек. Биттік AND барлық биттердің бір мәні болса ғана битке 1 мәні бар екі түрлі санды қалдыруға мүмкіндік береді. Мұның қызықтысы оның кейбір қолданбалы артықшылықтары болуы мүмкін:
int x=4;
System.out.println((x&1) != 1);
Бұл code паритет үшін x санын тексереді. Мысал қарастырайық:
Java: бит және byte - 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: бит және byte - 17
Кестеден көріп отырғанымыздай, алынған деректер көлемі бойынша деректер түрлері екі есе артады. Яғни, қысқа = 2 * byte, ал int = 2 * қысқа. Іс жүзінде есте сақтау оңай. Байт = 8 бит екенін есте сақтаңыз. Оның кем болмайтыны да есте. Ағылшын тілінде бүтін сан бүтін деп аталады. Одан шыққан қарабайыр түрі int аббревиатурасы деп аталды. Тұрақты бүтін сан бар - int. Қысқа нұсқасы бар, қысқасы, ұзақ нұсқасы ұзақ. Сәйкесінше, int 32 бит (4 byte) алады. Қысқа нұсқасы 2 есе аз - 16 бит (2 byte), ал ұзын нұсқасы екі есе үлкен, яғни. 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
Яғни, логикалық мән int сияқты бірдей соманы қабылдайды. Егер логикалық массив жарияласақ, онда массивтің әрбір элементі 1 byteты алады. Бұл кереметтер :)

Қорытынды

Біріктіру үшін тағы бірнеше материалдармен танысуды ұсынамын: #Вячеслав
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION