Бит өрісі - Bit field

A бит өрісі Бұл мәліметтер құрылымы жылы қолданылған компьютерлік бағдарламалау. Ол іргелес бірқатардан тұрады компьютер жады реттілігін өткізуге бөлінген орындар биттер, жиын ішіндегі кез-келген бит немесе биттер тобына жүгіну үшін сақталады.[1][2] Бит өрісі көбінесе бейнелеу үшін қолданылады интегралды түрлері белгілі, енінің бекітілген ені.

Өріс ішіндегі жеке биттердің мағынасын бағдарламашы анықтайды; мысалы, бит өрісіндегі бірінші бит (өрістің өрістерінде орналасқан) негізгі мекен-жай ) кейде бит өрісіне байланысты белгілі бір атрибуттың күйін анықтау үшін қолданылады.[3]

Ішінде микропроцессорлар және басқа логикалық құрылғылар, «жалаушалар» деп аталатын бит өрістерінің жиынтығы әдетте белгілі бір операциялардың аралық күйін немесе нәтижесін басқару үшін немесе көрсету үшін қолданылады.[4] Микропроцессорларда әдетте күй регистрі мұндай жалаушалардан тұрады, әр түрлі операциядан кейінгі жағдайларды көрсету үшін қолданылады, мысалы арифметикалық толып кету. Жалаушалар келесі операцияларды, мысалы, шартты өңдеу кезіндегі шешімдерді оқуға және қолдануға болады секіру нұсқаулары. Мысалы, а Дже ... Ішіндегі (тең болса секіру) нұсқауы x86 құрастыру тілі егер секіруге әкеледі Z (нөл) жалауша кейбір алдыңғы операциялармен орнатылған.

Бит өрісі а бит жиымы соңғысы бүтін сандармен индекстелген биттердің үлкен жиынтығын сақтау үшін қолданылады және көбінесе тіл қолдайтын кез-келген интегралды типке қарағанда кеңірек болады.[дәйексөз қажет ] Бит өрістері, керісінше, машинаның ішіне сәйкес келеді сөз,[3] ал биттердің белгіленуі олардың сандық көрсеткішіне тәуелсіз.[2]

Іске асыру

Бит өрістері жадының шығынын азайту үшін қолданыла алады, егер бағдарлама бірнеше мәндерге ие болатын бүтін сандық айнымалыларды қажет етеді. Мысалы, бүтін санды сақтау үшін көптеген жүйелерде екі байт (16-бит) жады қажет; кейде сақталатын мәндерге тек бір немесе екі бит қажет болады. Осы кішкене айнымалылардың саны аз болса да, олар өрісті жадқа тиімді түрде орауға мүмкіндік береді.[5]

C және C ++ тілдерінде жергілікті іске асырумен анықталған бит өрістерін unsigned int, imzalanmış int немесе (C99 :) _Bool көмегімен жасауға болады. Бұл жағдайда бағдарламалаушы бірнеше өрістердің енін белгілейтін және анықтайтын бит өрісі үшін құрылымды жариялай алады.[6] Жақында жарияланған бірдей типтегі биттік өрістерді компилятор сөздердің қысқартылған санына толтыра алады, егер әр 'өріс' бөлек жариялануы керек болса, қолданылатын жадпен салыстырғанда.

Жергілікті бит өрістері жоқ тілдер үшін немесе бағдарламалаушы битті кескіндеуді қатаң бақылауды қалайтын болса, үлкенірек сөз түріндегі биттерді қолмен басқаруға болады. Бұл жағдайда бағдарламалаушы өрістегі биттерді орнатуға, тексеруге және өзгерте алады маска және биттік операциялар. [7]

Мысалдар

C бағдарламалау тілі

Біраз өрісті жариялау C және C ++:

// мөлдір емес және көрсету# ИӘ-ны анықтау 1# ЖОҚ 0 анықтаңыз// стильдер# SOLID 1 анықтаңыз# НҰҚТАЛЫҚТЫ анықтаңыз 2# анықталған DASHED 3// негізгі түстер# КӨКТІ анықтаңыз /* 100 */# GREEN 2-ді анықтаңыз /* 010 */# ҚЫЗЫЛ 1 анықтаңыз /* 001 */// аралас түстер# ҚАРА 0-ді анықтаңыз /* 000 */# анықтаңыз САРЫ (ҚЫЗЫЛ | ЖАСЫЛ) /* 011 */# MAGENTA-ны анықтаңыз (ҚЫЗЫЛ | КӨК) /* 101 */# анықтаңыз КЯН (ЖАСЫЛ | КӨК) /* 110 */# АҚТАНЫ анықтаңыз (ҚЫЗЫЛ | ЖАСЫЛ | КӨК) /* 111 */const char* түстер[8] = {«Қара», «Қызыл», «Жасыл», «Сары», «Көк», «Қызыл күрең», «Көк», «Ақ»};// өріс өрісінің қасиеттеріқұрылым BoxProps{  қол қойылмаған int  мөлдір емес       : 1;  қол қойылмаған int  толтыру_түсі   : 3;  қол қойылмаған int               : 4; // 8 битке толтырыңыз  қол қойылмаған int  show_border  : 1;  қол қойылмаған int  шекара_түсі : 3;  қол қойылмаған int  шекара_стилі : 2;  қол қойылмаған char              : 0; // жақын байтқа дейін толтыру (16 бит)  қол қойылмаған char ені        : 4, // Байды 4 биттен тұратын 2 өріске бөліңіз                биіктігі       : 4;};

[8]

С-тегі бит өрістерінің орналасуы құрылым болып табылады іске асыру анықталған. Компиляторлар арасында болжамды болып қалатын мінез-құлық үшін бит өрістерін қарабайыр және бит операторларымен эмуляциялағаны жөн болар:

/ * Осы препроцессор директиваларының әрқайсысы бір битті анықтайды,   контроллердегі бір батырмаға сәйкес келеді. Түйменің реті   Nintendo Entertainment System-мен сәйкес келеді. * /# НЕГІЗГІ_РҰҚТЫ анықтау (1 << 0) /* 00000001 */# KEY_LEFT анықтау (1 << 1) /* 00000010 */# НЕГІЗГІ_ТӨМЕНДІ анықтау (1 << 2) /* 00000100 */#KEY_UP анықтау (1 << 3) /* 00001000 */# НЕГІЗГІ_Бастаманы анықтау (1 << 4) /* 00010000 */# анықтау KEY_SELECT (1 << 5) /* 00100000 */# KEY_B анықтау (1 << 6) /* 01000000 */# KEY_A анықтау (1 << 7) /* 10000000 */int gameControllerStatus = 0;/ * OR * / көмегімен gameControllerStatus орнатады.жарамсыз KeyPressed( int кілт ) { gameControllerStatus |= кілт; }/ * GameControllerStatus кілтін AND және ~ (екілік ЕМЕС) көмегімен өшіреді * /жарамсыз Кілт босатылды( int кілт ) { gameControllerStatus &= ~кілт; }/ * ЖӘНЕ * көмегімен биттің орнатылғандығын тексереді.int Қысылған( int кілт ) { қайту gameControllerStatus & кілт; }

Процессордың күй регистрі

Битфилдтің қарапайым мысалы күй регистрі сегіз разрядты дизайнға енгізілген 6502 процессор. Бір сегіз биттік өрісте жеті ақпарат болды:[9]

  • Бит 7. Теріс жалауша
  • Бит 6. Толып жатқан жалауша
  • Бит 5. Пайдаланылмаған
  • Бит 4. Туды үзу
  • Бит 3. Ондық жалауша
  • Бит 2. Үзу-өшіру жалаушасы
  • Бит 1. нөлдік жалауша
  • Бит 0. жалаушаны алып жүріңіз

Байрақ сөздерінен бит шығару

Жалаушалық өрістегі жалаушалар жиынтығын шығарып алуға болады ANDing а маска. Сонымен қатар, көптеген тілдер ауысым екінің қуатын орындау кезінде оператордың (<<) қолдануы ((1 << n) бағалайды ) экспоненциалдау, сонымен қатар ауысым операторымен бірге <<< ЖӘНЕ бір немесе бірнеше биттің мәнін анықтайтын оператор (&).

Күй-байт 103 (ондық) қайтарылды және күй-байт ішінде 5-жалауша битін тексергіміз келеді делік. Қызығушылық туы (сөзбе-сөз позициясы 6) 5-ші болып табылады, сондықтан маска-байт болады . ANDing күй-байт 103 (0110 0111 екілік түрінде) маска байтпен 32 (0010 0000 бинарлы) 32-ге теңестіреді, түпнұсқа маска-байт, бұл жалауша биті қойылған дегенді білдіреді; балама ретінде, егер жалауша биті орнатылмаған болса, бұл әрекет 0-ге тең болар еді.

Осылайша, тексеру үшін nайнымалыдан th бит v, біз операцияны орындай аламыз:

bool nth_is_set = (v & (1 << n=); Bool nth_is_set = (v >> n) & 1;

Байрақ сөздеріндегі биттерді өзгерту

Биттерді жазу, оқу немесе ауыстыру жалауларда тек НЕМЕСЕ, ЖӘНЕ ЕМЕС операцияларын қолдану арқылы жүзеге асады - бұл процессорда тез орындалатын амалдар. Біраз орнату үшін, НЕМЕСЕ маска байты бар күй байты. Маска байтына немесе күй байтына орнатылған кез-келген бит нәтижеге қойылады.

Аздап ауысу үшін, XOR күй байт және маска байт. Егер ол тазаланса, аздап орнатылады немесе орнатылған болса, аздап өшіріледі.

Әдебиеттер тізімі

  1. ^ Пенн Брумм; Дон Брумм (тамыз 1988). 80386 Ассемблер тілі: толық оқу құралы және ішкі кітапхана. McGraw-Hill мектебінің білім беру тобы. б. 606. ISBN  978-0-8306-9047-3.
  2. ^ а б Стив Уаллайн (1997). Практикалық бағдарламалау. «O'Reilly Media, Inc.». бет.403 –. ISBN  978-1-56592-306-5.
  3. ^ а б Майкл А. Миллер (1992 ж. Қаңтар). 68000 микропроцессорлық отбасы: сәулет, бағдарламалау және бағдарламалар. Меррилл. б. 323. ISBN  978-0-02-381560-7.
  4. ^ Ян Гриффитс; Мэттью Адамс; Джесси Либерти (30 шілде 2010). Бағдарламалау C # 4.0: .NET 4.0 Framework үшін Windows, Web және RIA қосымшаларын құру. «O'Reilly Media, Inc.». 81– бет. ISBN  978-1-4493-9972-6.
  5. ^ Тибет Мимар (1991). 68000 отбасымен бағдарламалау және жобалау: соның ішінде 68000, 68010/12, 68020 және 68030. Prentice Hall. б. 275. ISBN  978-0-13-731498-0.
  6. ^ Prata, Stephen (2007). C праймер плюс (5-ші басылым). Индианаполис, Инд: Самс. ISBN  0-672-32696-5.
  7. ^ Марк Э. Даггетт (13 қараша 2013). Сарапшы JavaScript. Апрес. 68–18 бет. ISBN  978-1-4302-6097-4.
  8. ^ Prata, Stephen (2007). C праймер плюс (5-ші басылым). Индианаполис, Инд: Самс. ISBN  0-672-32696-5.
  9. ^ InCider. W. Green. Қаңтар 1986. б. 108.

Сондай-ақ қараңыз

Сыртқы сілтемелер