Bit qatori - Bit array

A bit qatori (shuningdek, nomi bilan tanilgan bit xaritasi, bit o'rnatilgan, bit ip, yoki bit vektor) an massiv ma'lumotlar tarkibi ixcham saqlaydi bitlar. Bu oddiyni amalga oshirish uchun ishlatilishi mumkin ma'lumotlar tuzilishini o'rnatish. Bit massivi operatsiyalarni tez bajarish uchun apparatda bit darajasidagi parallellikdan foydalanishda samarali bo'ladi. Oddiy bitlar qatori saqlanadi kw bitlar, qaerda w kabi saqlash birligidagi bitlar soni, masalan bayt yoki so'z va k manfiy bo'lmagan butun son. Agar w saqlanadigan bitlar sonini ajratmaydi, bir oz bo'sh joy tufayli isrof bo'ladi ichki parchalanish.

Ta'rif

Bit qatori bu ba'zi bir domendan (deyarli har doim butun sonlar oralig'ida) {0, 1} to'plamidagi qiymatlarga xaritalashdir. Qadriyatlar qorong'u / och, yo'q / mavjud, qulflangan / blokdan chiqarilgan, yaroqsiz / yaroqsiz va boshqalar sifatida talqin qilinishi mumkin. Gap shundaki, faqat ikkita qiymat bo'lishi mumkin, shuning uchun ularni bitta bitda saqlash mumkin. Boshqa massivlarda bo'lgani kabi, bitta bitga kirish massivga indeksni qo'llash orqali boshqarilishi mumkin. Uning o'lchamini (yoki uzunligini) taxmin qilsak n bit, qator domenning kichik qismini belgilash uchun ishlatilishi mumkin (masalan, {0, 1, 2, ..., n−1}), bu erda 1 bit to'plamda raqam mavjudligini va 0 bit yo'qligini bildiradi. Ushbu ma'lumotlar tuzilmasi taxminan foydalanadi n/w kosmik so'zlar, qaerda w har bitdagi bitlar soni mashina so'zi. Eng muhim bit (so'zning) yoki eng muhim bitning eng kichik indeks raqamini ko'rsatishi ahamiyatsiz, ammo birinchisiga ustunlik beriladi ( ozgina endian mashinalar).

Asosiy operatsiyalar

Garchi ko'pchilik mashinalar shaxsiy bitlarni xotirada hal qila olmasa yoki bitta bitlarni boshqarish bo'yicha ko'rsatmalarga ega bo'lmasada, so'zning har bir bitini ajratib ko'rsatish va ularni boshqarish orqali boshqarish mumkin. bitli operatsiyalar. Jumladan:

  • Yoki bittasini bittasiga o'rnatish uchun foydalanish mumkin: 11101010 OR 00000100 = 11101110
  • Va bir oz nolga o'rnatish uchun ishlatilishi mumkin: 11101010 VA 11111101 = 11101000
  • Va nol-sinov bilan birgalikda bit o'rnatilganligini aniqlash uchun foydalanish mumkin:
    11101010 VA 00000001 = 00000000 = 0
    11101010 VA 00000010 = 00000010 ≠ 0
  • XORni teskari o'zgartirish yoki almashtirish uchun foydalanish mumkin:
    11101010 XOR 00000100 = 11101110
    11101110 XOR 00000100 = 11101010
  • NOT barcha bitlarni teskari aylantirish uchun ishlatilishi mumkin.
    10110010 = 01001101 emas

Olish uchun bit niqobi ushbu operatsiyalar uchun zarur bo'lsa, biz foydalanishingiz mumkin bit siljishi 1-sonni tegishli joylar soniga chapga siljitish operatori, shuningdek bitik inkor agar kerak bo'lsa.

To'plamlarni ifodalaydigan bir xil o'lchamdagi ikkita bitli massivlarni hisobga olgan holda, biz ularni hisoblashimiz mumkin birlashma, kesishish va nazariy farq foydalanish n/w har biri oddiy bit operatsiyalari (2n/w farq uchun), shuningdek to'ldiruvchi ikkalasi ham:

i uchun 0 dan n / w-1 gacha komplement_a [i]: = a [i] birlashma [i]: = a [i] yoki b [i] kesishma [i]: = a [i] va b [i ] farq [i]: = a [i] va (b [i] emas)

Agar biz bit massivining bitlarini takrorlashni xohlasak, buni har bir so'zni birma-bir ko'rib chiqadigan ikki marta joylashtirilgan tsikl yordamida samarali bajarishimiz mumkin. Faqat n/w xotiraga kirish talab qilinadi:

i uchun 0 dan n / w-1 gacha bo'lgan ko'rsatkich: = 0 // agar kerak bo'lsa so'z: = a [i] b uchun 0 dan w-1 gacha bo'lgan qiymat: = so'z va 1 ≠ 0 so'z: = so'zni o'ngga siljitish 1 // qiymat indeksi bilan biror narsa qiling: = indeks + 1 // agar kerak bo'lsa

Ushbu ikkala kod namunalari idealdir ma'lumotlarning joylashuvi, keyinchalik bu ma'lumotlar keshidan katta ishlashni kuchaytiradi. Agar kesh liniyasi bo'lsa k so'zlar, faqat haqida n/wk keshni o'tkazib yuborish sodir bo'ladi.

Keyinchalik murakkab operatsiyalar

Xuddi shunday belgilar satrlari aniq belgilash kerak uzunlik, pastki chiziq, leksikografik taqqoslash, birlashtirish, teskari operatsiyalar. Ushbu operatsiyalarning ayrimlarini amalga oshirish sezgir endianness.

Aholining og'irligi

Agar biz bit massivida 1 bit sonini topishni xohlasak, ba'zan uni populyatsiya soni yoki Hamming og'irligi deb atashsa, oddiy bit operatsiyalari ketma-ketligi yordamida so'zdagi bitlar sonini hisoblab chiqadigan samarali tarmoqsiz algoritmlar mavjud. Biz shunchaki har bir so'zda bunday algoritmni ishlatamiz va umumiy sonni saqlaymiz. Nollarni hisoblash ham shunga o'xshash. Ga qarang Hamming vazni samarali amalga oshirish misollari uchun maqola.

Inversiya

Pikselli bitli bitta rasmni yoki ba'zi FFT algoritmlarini vertikal ravishda aylantirish uchun alohida so'zlarning bitlarini aylantirish kerak (shuning uchun b31 b30 ... b0 bo'ladi b0 ... b30 b31Ushbu operatsiyani protsessorda mavjud bo'lmaganda, ketma-ket o'tishlar bilan davom ettirish mumkin, bu misolda 32 bit:

almashish ikkitasi 16bit yarim so'zlaralmashish bayt tomonidan juftliklar (0xddccbbaa -> 0xccddaabb)...almashtirish bitlar tomonidan juftliklaralmashtirish bitlar (b31 b30 ... b1 b0 -> b30 b31 ... b0 b1)The oxirgi operatsiya mumkin bo'lishi yozilgan ((x&0x55555555)<<1) | (x&0xaaaaaaaa)>>1)).

Birinchisini toping

The birinchi to'plamni toping yoki birinchisini toping operatsiya massivdagi eng kichik indeks bilan 1-bitning indeksini yoki pozitsiyasini aniqlaydi va keng tarqalgan apparat qo'llab-quvvatlashiga ega (so'zdan katta bo'lmagan massivlar uchun) va uni hisoblash uchun samarali algoritmlarga ega. Qachon ustuvor navbat bit qatorida saqlanadi, birinchi navbatda navbatdagi eng yuqori ustuvor elementni aniqlash uchun foydalanish mumkin. So'z hajmini kengaytirish uchun birinchisini toping uzunroq massivlarga birinchi nolga teng bo'lmagan so'zni topib, keyin ishga tushirish mumkin birinchisini toping bu so'zda. Bilan bog'liq operatsiyalar birinchi nolni toping, etakchi nollarni hisoblash, etakchilarni hisoblang, orqadagi nollarni hisoblash, orqada qolganlarni hisoblangva log bazasi 2 (qarang birinchi to'plamni toping ) to'g'ridan-to'g'ri bit qatoriga kengaytirilishi mumkin.

Siqish

Bit massivi - bu "tasodifiy" bitlar uchun eng zich joy, ya'ni har bir bit 0 yoki 1 ga teng bo'lishi mumkin va ularning har biri mustaqil. Ammo ko'pgina ma'lumotlar tasodifiy emas, shuning uchun ularni ixchamroq saqlash mumkin bo'lishi mumkin. Masalan, odatdagi faks tasvirining ma'lumotlari tasodifiy emas va ularni siqish mumkin. Uzunlik bo'yicha kodlash odatda bu uzun oqimlarni siqish uchun ishlatiladi. Biroq, siqilgan ma'lumotlarning aksariyat shakllariga tasodifiy kirish juda oson emas; shuningdek, bit massivlarini juda agressiv ravishda siqish orqali biz bit darajasidagi parallellik tufayli foydalarni yo'qotish xavfi bor (vektorlashtirish ). Shunday qilib, bit massivlarini bitlar oqimi sifatida siqish o'rniga ularni baytlar yoki so'zlar oqimlari sifatida siqishimiz mumkin (qarang. Bitmap indeksi (siqish) ).

Afzalliklari va kamchiliklari

Bit massivlari, soddaligiga qaramay, boshqa ma'lumotlar tuzilmalariga nisbatan bir xil muammolar uchun bir qator afzalliklarga ega:

  • Ular nihoyatda ixcham; boshqa hech qanday ma'lumot tuzilmalari saqlay olmaydi n mustaqil ma'lumotlar qismlari n/w so'zlar.
  • Ular kichik bitli massivlarni registrda uzoq vaqt davomida saqlashga va boshqarish imkoniyatiga ega bo'lmasdan ruxsat berishadi.
  • Bit darajasidagi parallellikdan foydalanish, xotiraga kirishni cheklash va ma'lumotlar keshi, ular ko'pincha boshqa ma'lumotlar tuzilmalaridan amaliy ma'lumotlar to'plamlarida, hatto asimptotik jihatdan samaraliroq bo'lgan narsalardan ustun turishadi.

Biroq, bit massivlari hamma narsaning echimi emas. Jumladan:

  • Siqilmasdan, ular vaqt va makonda kamdan-kam to'plamlar (ularning diapazoniga nisbatan oz sonli elementlarga ega) uchun behuda ma'lumotlar to'plamlari. Bunday dasturlar uchun siqilgan bitli massivlar, Judy massivlari, harakat qiladi, yoki hatto Bloom filtrlari o'rniga ko'rib chiqilishi kerak.
  • Ayrim elementlarga kirish qimmat va ba'zi tillarda ifodalash qiyin bo'lishi mumkin. Agar tasodifiy kirish ketma-ketlikka qaraganda tez-tez uchraydigan bo'lsa va massiv nisbatan kichik bo'lsa, bayt manzilga ega bo'lgan mashinada baytlar qatori afzalroq bo'lishi mumkin. So'zlar qatori, ehtimol katta hajmdagi bo'sh joy va qo'shimcha keshni o'tkazib yuborishi sababli oqlanmasligi mumkin, agar mashinada faqat so'z adreslash bo'lmasa.

Ilovalar

O'zining ixchamligi tufayli bit massivlari bo'sh joy yoki samaradorlik ustun bo'lgan joylarda bir qator dasturlarga ega. Odatda, ular mantiqiy bayroqlarning oddiy guruhini yoki mantiqiy qiymatlarning tartiblangan ketma-ketligini ifodalash uchun ishlatiladi.

Bit massivlari uchun ishlatiladi ustuvor navbat, bu erda bit indeks k agar o'rnatilgan bo'lsa va faqat agar k navbatda; bu ma'lumotlar tuzilmasi, masalan, tomonidan ishlatiladi Linux yadrosi, va apparatdagi birinchi nolinchi operatsiyadan katta foyda ko'radi.

Ajratish uchun bit massivlaridan foydalanish mumkin xotira sahifalari, inodlar, disk sektorlari va boshqalar. Bunday hollarda atama bitmap ishlatilishi mumkin. Biroq, ushbu atama tez-tez murojaat qilish uchun ishlatiladi raster tasvirlar, bir nechta ishlatilishi mumkin piksel uchun bit.

Bit massivlarining yana bir qo'llanilishi Bloom filtri, ehtimollik ma'lumotlar tuzilishini o'rnatish kichik to'plamda xatolik ehtimoli evaziga katta to'plamlarni saqlashi mumkin. Ehtimolni tuzish ham mumkin xash jadvallar yolg'on ijobiy yoki noto'g'ri negativlarni qabul qiladigan bitli massivlarga asoslangan.

Bit massivlari va ulardagi amallar ham qurish uchun muhimdir qisqacha ma'lumotlar tuzilmalari, ulardan foydalanish mumkin bo'lgan minimal maydonga yaqin. Shu nuqtai nazardan, kabi operatsiyalar n1 bit yoki ma'lum bir joyga qadar 1 bit sonini hisoblash muhim ahamiyat kasb etadi.

Bit massivlari ham oqimlarni tekshirish uchun foydali mavhumlikdir siqilgan tez-tez baytlarning bir qismini egallaydigan yoki baytga to'g'ri kelmaydigan elementlarni o'z ichiga olgan ma'lumotlar. Masalan, siqilgan Huffman kodlash bitta 8-bitli belgini aks ettirish uzunligi 1 dan 255 bitgacha bo'lishi mumkin.

Yilda ma'lumot olish, bit massivlari ro'yxatlarni joylashtirish juda tez-tez uchraydigan shartlar. Agar qo'shni qiymatlar orasidagi bo'shliqlarni qat'iy ravishda ko'payib boradigan butun sonlar ro'yxatida hisoblasak va ularni ishlatib kodlashtirsak unary kodlash, natija ichida 1 bitli bit massiv bo'ladi nth holati va agar shunday bo'lsa n ro'yxatda. Bo'shliqning taxminiy ehtimoli n 1/2 ga tengn. Bu ham alohida holat Golomb kodlash bu erda M parametri 1 ga teng; bu parametr odatda -log (2-) bo'lganda tanlanadip) / jurnal (1-p) ≤ 1, yoki bu atama hujjatlarning kamida 38% da uchraydi.

Tilni qo'llab-quvvatlash

The APL dasturlash tili mantiqiy ma'lumotlar turi sifatida o'zboshimchalik shakli va o'lchamdagi bit massivlarini to'liq qo'llab-quvvatlaydi. Barcha asosiy dasturlar (Dyalog APL, APL2, APL Next, NARS2000, Gnu APL va hokazo.) bitlarni mashina so'zi qanday hajmda bo'lmasin, zich qilib to'plang. Bitlarga odatiy indeksatsiya yozuvlari (A [3]) orqali, shuningdek, odatdagi barcha ibtidoiy funktsiyalar va operatorlar orqali alohida kirish mumkin, chunki ular tez-tez bitlarni jadvallarni qidirish orqali yig'ish kabi maxsus ish algoritmidan foydalaniladi. .

The C dasturlash tili "s bit maydonlari, o'lchamlari bitlarning soniga teng bo'lgan konstruktsiyalarda topilgan psevdo-ob'ektlar aslida kichik bitli massivlar; ular so'zlarni qamrab ololmasliklari bilan cheklangan. Garchi ular qulay sintaksisni taqdim qilsalar ham, ko'pgina mashinalarda bitli operatorlar yordamida bitlarga kirish mumkin va ular faqat statik tarzda aniqlanishi mumkin (C ning statik massivlari kabi, ularning o'lchamlari kompilyatsiya vaqtida o'rnatiladi). Bundan tashqari, C dasturchilari uchun so'zlarni kichik bitli massiv sifatida ishlatish va bit operatorlari yordamida ularning bitlariga kirish odatiy iboradir. Ga kiritilgan keng tarqalgan sarlavha fayli X11 system, xtrapbits.h, bu "tizimlar uchun bitlar qatorining bitli maydon manipulyatsiyasini aniqlashning ko'chma usuli". Yuqorida aytib o'tilgan yondashuvning yanada tushunarli tavsifini ushbu sahifada topish mumkin comp.lang.c FAQ.

Yilda C ++, garchi individual bo'lsa ham bools odatda bayt yoki butun son bilan bir xil maydonni egallaydi STL turi vektor a qisman shablon ixtisosligi unda bitlar kosmik samaradorlikni optimallashtirish sifatida qadoqlangan. Baytlar (va bitlar emas) C ++ da eng kichik adreslanadigan birlik bo'lganligi sababli, [] operatori bajaradi emas elementga havolani qaytaring, aksincha a ni qaytaring proksi-ma'lumotnoma. Bu mayda tuyulishi mumkin, ammo bu shuni anglatadiki vektor bu emas standart STL konteyner, shuning uchun foydalanish vektor odatda tushkunlikka tushadi. Yana bir noyob STL klassi, bitset,[1] kompilyatsiya vaqtida ma'lum bir o'lchamda aniqlangan bitlarning vektorini yaratadi va uning interfeysi va sintaksisida ko'proq C dasturchilari tomonidan bitlar to'plami sifatida so'zlarning idiomatik ishlatilishiga o'xshaydi. Shuningdek, u o'rnatilgan bitlar sonini samarali hisoblash qobiliyati kabi qo'shimcha kuchga ega. The C ++ kutubxonalarini kuchaytirish ta'minlash dinamik_bitset sinf[2] uning hajmi ish vaqtida ko'rsatilgan.

The D dasturlash tili o'zining standart kutubxonasi bo'lgan Phobos-da bit massivlarini taqdim etadi std.bitmanip. C ++ da bo'lgani kabi, [] operatori mos yozuvlarni qaytarmaydi, chunki individual bitlarning aksariyati qo'shimcha qurilmalarda to'g'ridan-to'g'ri adreslanmaydi, aksincha bool.

Yilda Java, sinf BitSet keyinchalik C dasturchilariga tanish bo'lgan bit operatorlar nomidagi funktsiyalar bilan boshqariladigan bitli qator yaratadi. Dan farqli o'laroq bitset C ++ da, Java BitSet "o'lchov" holatiga ega emas (u 0 bit bilan boshlangan samarali cheksiz hajmga ega); bitni har qanday indeksda o'rnatish yoki sinash mumkin. Bundan tashqari, sinf mavjud EnumSet, bu an qiymatlari to'plamini ifodalaydi sanab o'tilgan turi ichki sifatida bit vektor sifatida, bit maydonlariga xavfsiz alternativ sifatida.

The .NET Framework ta'minot a BitArray yig'ish klassi. Bu mantiqiy qiymatlarni saqlaydi, tasodifiy kirishni va bitli operatorlarni qo'llab-quvvatlaydi, takrorlanishi mumkin va uning Uzunlik mulkni o'stirish yoki qisqartirish uchun o'zgartirish mumkin.

Garchi Standart ML bitli massivlarni qo'llab-quvvatlamaydi, Nyu-Jersi shtatidagi Standart ML kengaytmasiga ega BitArray tuzilishi, uning SML / NJ kutubxonasida. U hajmi jihatidan aniqlanmagan va o'rnatilgan operatsiyalar va bit operatsiyalarini, shu jumladan, odatiy bo'lmagan smenali operatsiyalarni qo'llab-quvvatlaydi.

Xaskell Shuningdek, hozirda bitli operatsiyalar uchun standart qo'llab-quvvatlash mavjud emas, ammo GHC va Hugs ikkalasi ham Ma'lumotlar bitlari Bit qatorini modellashtirish uchun bitli qator funktsiyalari va operatorlari, shu jumladan siljitish va aylantirish operatsiyalari va mantiqiy qiymatlar ustidan "qutisiz" qator ishlatilishi mumkin, ammo bu avvalgi modul tomonidan qo'llab-quvvatlanmaydi.

Yilda Perl, satrlar kengaytiriladigan bit massivlari sifatida ishlatilishi mumkin. Ular odatiy bitli operatorlar yordamida boshqarilishi mumkin (~ | & ^),[3] va individual bitlar yordamida sinovdan o'tkazilishi va o'rnatilishi mumkin vec funktsiya.[4]

Yilda Yoqut, siz bir oz butun songa kirishingiz mumkin (lekin o'rnatilmagan)Fixnum yoki Bignum) qavs operatoridan foydalanish ([]), xuddi bitlar qatori kabi.

Olmalar Asosiy fond kutubxonada mavjud CFBitVector va CFMutableBitVector tuzilmalar.

PL / I qatorlarini qo'llab-quvvatlaydi bit iplar uzunligi yoki o'zgaruvchan bo'lishi mumkin bo'lgan o'zboshimchalik uzunligi. Massiv elementlari bo'lishi mumkin moslashtirilgan- har bir element bayt yoki so'z chegarasidan boshlanadi - yoki tekislanmagan- elementlar zudlik bilan bir-birini to'ldirmasdan to'ldiradi.

PL / pgSQL va PostgreSQL-ning SQL-quvvatlashi bit iplar mahalliy turi sifatida. Ikkita SQL bit turi mavjud: bit (n) va bit o'zgaruvchan (n), qayerda n musbat butun son.[5]

Kabi apparatni tavsiflash tillari VHDL, Verilog va SystemVerilog bit vektorlarini tabiiy ravishda qo'llab-quvvatlaydi, chunki ular kabi saqlash elementlarini modellashtirish uchun ishlatiladi sohil shippaklari, apparat shinalari va umuman apparat signallari. Kabi apparatni tekshirish tillarida OpenVera, e va SystemVerilog, bit vektorlari apparat modellaridan qiymatlarni tanlash va simulyatsiya paytida apparatga uzatiladigan ma'lumotlarni aks ettirish uchun ishlatiladi.

Shuningdek qarang

Adabiyotlar

  1. ^ "SGI.com Tech Archive Resources endi nafaqaga chiqqan". SGI. 2018 yil 2-yanvar.
  2. ^ "dynamic_bitset - 1.66.0". www.boost.org.
  3. ^ "perlop - perldoc.perl.org". perldoc.perl.org.
  4. ^ "vec - perldoc.perl.org". perldoc.perl.org.
  5. ^ https://www.postgresql.org/docs/current/datatype-bit.html

Tashqi havolalar