Кіріспе
Биттерді ықшам түрде сақтайтын деректер құрылымы. Биттік массив (біттік маска деп те аталады,
A bit array (also known as bitmask,
Күрделі операциялар
Мәтіндік тізбектер сияқты, ұзындығын, кіші тізбегін, лексикографиялық салыстыруды, біріктіруді, кері операцияларды анықтау оңай. Осы операциялардың кейбіреуін іске асыру ендиандыққа (байтының ретіне) сезімтал болуы мүмкін.
Халық / Бағыт салмағы
Егер біт массивіндегі 1-дің санын табуды қаласақ, бұл кейде популяция саны немесе Хамминг салмағы деп аталады, онда сөз ішіндегі биттер санын есептеу үшін қарапайым бит операцияларының тізбегін пайдаланатын тиімді, тармақталусыз алгоритмдер бар. Біз мұндай алгоритмді әрбір сөзге қолданып, жалпы соманы есептейміз. 0-ді санау да осыған ұқсас. Тиімді іске асыру мысалдары үшін Хамминг салмағы туралы мақаланы қараңыз.
Біріншісін табу
Find first set немесе find first one операциясы массивтегі ең кіші индексі бар 1 биттің индексін немесе орнын анықтайды және аппараттық қолдауға кеңінен ие (бір сөзден аспайтын массивтер үшін), сондай-ақ оны есептеу үшін тиімді алгоритмдер бар. Басымдық кезегі бит массивінде сақталғанда, find first one операциясы кезектегі ең жоғары басымдыққа ие элементті анықтау үшін қолданылуы мүмкін. Сөз өлшемін ұзарту үшін, find first one операциясын ұзын массивтерге қолдану үшін, ең алдымен нөл емес сөзді табу керек, содан кейін осы сөз ішінде find first one операциясын орындау қажет. Қатысты операциялар – find first zero, алдыңғы нөлдерді санау, алдыңғы бірлерді санау, соңғы нөлдерді санау, соңғы бірлерді санау және 2-ге логарифм (find first set-ке қараңыз) – бит массивіне де оңай кеңейтілуі мүмкін.
Сығу
Біт массиві – "кездейсоқ" биттерді сақтаудың ең тығыз тәсілі, яғни әр бит 0 немесе 1 болуы мүмкін және олардың әрқайсысы тәуелсіз. Бірақ көптеген деректер кездейсоқ емес, сондықтан оларды ықшамдап сақтауға болады. Мысалы, әдеттегі факс суретінің деректері кездейсоқ емес және оларды қысуға болады. Осындай ұзын тізбектерді қысу үшін көбінесе жүріс ұзындығын кодтау қолданылады. Дегенмен, көптеген қысылған деректер форматтарына тікелей қол жеткізу қиын; сондай-ақ, біт массивін тым күшті қысу біт деңгейіндегі параллелизмнің (векторизация) артықшылықтарын жоғалту қаупін тудырады. Сондықтан, біт массивін биттер тізбегі ретінде қысудың орнына, оларды байттар немесе сөздер тізбегі ретінде қысуға болады (Биттік карта индексі (қысу) бөлімін қараңыз).
Қолданбалар
Біттік массивтер тығыздығына байланысты кеңістік немесе тиімділік маңызды болатын салаларда көптеген қолданыстарға ие. Көбінесе олар қарапайым логикалық флагтар тобын немесе логикалық мәндердің реттелген тізбегін көрсету үшін қолданылады. Биттік массивтер басымдық кезегі үшін пайдаланылады, онда k индексіндегі бит тек қана k кезекте болса орнатылады; мысалы, Linux ядросы осы дерек құрылымын пайдаланады және аппараттық құралдардағы бірінші нөлді табу операциясынан үлкен пайда көреді. Биттік массивтер жад беттерін, inode-тарды, дискілік секторларды және т.б. бөлу үшін қолданылуы мүмкін. Мұндай жағдайларда «бит картасы» термині қолданылуы мүмкін. Дегенмен, бұл термин көбінесе пикселге бірнеше биттерді пайдаланатын растрлық кескіндерге қатысты қолданылады. Биттік массивтердің тағы бір қолданылуы – Блум сүзгісі, бұл үлкен жиынтықтарды кішкентай кеңістікте сақтауға мүмкіндік беретін, бірақ қате болу ықтималдығы бар, ықтималдық жиынтық деректер құрылымы. Сондай-ақ, жалған оң немесе жалған теріс нәтижелерді қабылдайтын биттік массивлерге негізделген ықтималдық хеш-кестелерді құруға болады. Биттік массивтер және олармен орындалатын операциялар, мүмкіндігінше ең аз кеңістікті пайдаланатын ықшам деректер құрылымдарын құру үшін де маңызды. Осы контексте, n-ші 1 битті табу немесе белгілі бір позицияға дейін 1 биттердің санын санау сияқты операциялар маңызды болады. Биттік массивтер сығылған деректер ағынын қарастыру үшін де пайдалы абстракция болып табылады, олар көбінесе байттың бір бөлігін алып жататын немесе байтқа сәйкес келмейтін элементтерді қамтиды. Мысалы, 8 биттік символдың сығылған Хаффман кодтамасы 1-ден 255 битке дейін ұзын болуы мүмкін. Ақпаратты іздеуде, биттік массивтер өте жиі кездесетін терминдердің тізімдерін көрсету үшін жақсы бейнелеу болып табылады. Егер қатаң түрде өсуші бүтін сандар тізіміндегі жақын мәндер арасындағы аралықтарды есептеп, оларды унарлық кодтау арқылы кодтасақ, нәтижесіндегі биттік массивте n-ші орында 1 бит тек қана тізімде n болса ғана орналасады. n аралығының болу ықтималдығы 1/2n тең. Бұл сондай-ақ Голомб кодтамасының ерекше жағдайы, онда M параметрі 1-ге тең; бұл параметр әдетте −log(2 − p) / log(1 − p) ≤ 1 шарты орындалғанда ғана таңдалады, яғни термин кем дегенде 38% құжаттарда кездеседі.
Тілдік қолдау
APL бағдарламалау тілі бүтін сандардан ерекшеленетін Бульдік деректер түрі ретінде кез келген пішін мен өлшемдегі бит массивтерін толық қолдайды. Барлық негізгі нұсқалары (Dyalog APL, APL2, APL Next, NARS2000, Gnu APL және т.б.) биттерді машиналық сөздің кез келген өлшеміне тығыз жинақтайды. Биттерге әдеттегі индекстеу белгісі (A[3]) арқылы жеке-жеке қол жеткізуге болады, сондай-ақ барлық стандартты примитивтік функциялар мен операторлар арқылы, олар көбінесе арнайы алгоритмді пайдалана отырып, мысалы, байттар тізімі арқылы биттерді қосу арқылы жұмыс істейді. C бағдарламалау тілінің бит өрістері, құрылымдардағы жалған нысандар, олардың өлшемі бірнеше битке тең, шын мәнінде шағын бит массивтері болып табылады; олар сөздерді қамти алмайды. Олар ыңғайлы синтаксис ұсынса да, көп жағдайда биттерге байттық операторлар арқылы қол жеткізіледі және оларды тек статикалық түрде анықтауға болады (C-тің статикалық массивлері сияқты, олардың өлшемдері компиляция кезінде белгіленеді). Сондай-ақ, C бағдарламашылары үшін сөздерді шағын бит массивтері ретінде пайдалану және олардың биттеріне биттік операторлар арқылы қол жеткізу әдетке айналған. X11 жүйесінде кеңінен қолжетімді xtrapbits.h файлы – жүйелердің бит массивтеріндегі бит өрістерін манипуляциялауын анықтаудың портативті тәсілі. Аталған тәсілдің толық сипаттамасын comp.lang.c жиі қойылатын сұрақтар бөлімінен табуға болады. C++-да, жеке bool мәндері байт немесе бүтін санмен бірдей орынды алатын болса да, STL-дің vector<bool> типі – кеңістікті үнемдеу үшін биттерді жинақтайтын жартылай шаблондық мамандану болып табылады. C++-да байттар (биттер емес) адрестелетін ең кіші бірлік болғандықтан, [] операторы элементке сілтеме емес, прокси сілтеме қайтарады. Бұл шағын мәселе сияқты көрінуі мүмкін, бірақ vector<bool> стандартты STL контейнері емес екенін білдіреді, сондықтан vector<bool> пайдалану көбінесе ұсынылмайды. STL-дің тағы бір ерекше класы – bitset, кездейсоқ қол жеткізуді және биттік операторларды қолдайды, итерацияланады және оның Length қасиетін өсіру немесе қысқарту үшін өзгертуге болады. Standard ML бит массивтерін қолдамаса да, Standard ML of New Jersey кітапханасында BitArray құрылымы бар. Ол белгілі бір өлшемде емес және біттік операцияларды, соның ішінде ауысу операцияларын қолдайды. Haskell қазіргі уақытта біттік операциялар үшін стандартты қолдауды ұсынбайды, бірақ GHC және Hugs екеуі де Data.Bits модулін ұсынады, онда түрлі біттік функциялар мен операторлар, соның ішінде ауысу және айналу операциялары бар, сондай-ақ Бульдік мәндердегі "қоршалмаған" массивты біт массивін модельдеу үшін пайдалануға болады, бірақ бұрынғы модуль оны қолдамайды. Perl-де жолдар кеңейтілетін бит массивтері ретінде қолданылуы мүмкін. Оларды (~ | & ^) сияқты стандартты біттік операторлар арқылы манипуляциялауға болады, ал жеке биттерді vec функциясы арқылы тексеруге және орнатуға болады. Ruby-де, сіз ([]) жақша операторын пайдаланып, бүтін санның (Fixnum немесе Bignum) бітіне қол жеткізе аласыз (бірақ орната алмайсыз), оны биттер массиві ретінде қарастырғандай. Apple-дың Core Foundation кітапханасында CFBitVector және CFMutableBitVector құрылымдары бар. PL/I кез келген ұзындығы бар биттік тізбектердің массивтерін қолдайды, олар тұрақты немесе өзгермелі ұзындықта болуы мүмкін. Массив элементтері сәйкестендірілуі мүмкін – әр элемент байт немесе сөз шекарасында басталады – немесе сәйкестендірілмейді – элементтер бірден тікелей орналасады, аралық кеңістік болмайды. PL/pgSQL және PostgreSQL-дің SQL тілі біт тізбектерін туа пайдалануға болатын тип ретінде қолдайды. SQL-де екі бит типі бар: bit(n) және bit varying(n), мұнда n – оң бүтін сан. VHDL, Verilog және SystemVerilog сияқты аппараттық сипаттама тілдері бит векторларын туа қолдайды, өйткені олар жад сақтау элементтерін (флип-флоптар), аппараттық шиналарды және жалпы аппараттық сигналдарды модельдеу үшін қолданылады. OpenVera, e және SystemVerilog сияқты аппараттық тексеру тілдерінде бит векторлары аппараттық модельдерден мәндерді алу үшін және симуляция кезінде аппаратқа берілетін деректерді көрсету үшін қолданылады. Common Lisp бір өлшемді бит векторын туа массивтің ерекше жағдайы ретінде ұсынады, ол кластың және типтік спецификатордың екі қызметін атқарады. Массивтің туындысы болғандықтан, ол бит элементінің түрімен конфигурацияланатын жалпы массив функциясына сүйенеді, бұл бит векторының динамикалық түрде өзгертілуіне мүмкіндік береді. Дегенмен, бит векторы шексіз емес. Қарапайым бит векторының шектеулі түрі де бар, ол динамикалық сипаттамаларды тікелей алып тастайды. Бит векторларын #*bits оқу макросы арқылы ықшам түрде көрсетуге және құруға болады. Барлық массивтарға қолданылатын жалпы функциялардан өзге, бит векторлары үшін арнайы операциялар да бар. Жеке биттерге bit және sbit функцияларын пайдаланып қол жеткізуге және өзгертуге болады, сондай-ақ көптеген логикалық операциялар қолдау көрсетіледі.