مصفوفة بت
مصفوفة البتات (المعروفة أيضًا باسم خريطة البتات ، أو مجموعة البتات ، أو سلسلة البتات ، أو متجه البتات ) هي بنية بيانات مصفوفية تخزن البتات بشكل مضغوط . يمكن استخدامها لتنفيذ بنية بيانات مجموعة بسيطة . تتميز مصفوفة البتات بفعاليتها في استغلال التوازي على مستوى البتات في الأجهزة لتنفيذ العمليات بسرعة. تخزن مصفوفة البتات النموذجية kw بت، حيث w هو عدد البتات في وحدة التخزين، مثل البايت أو الكلمة ، و k عدد صحيح موجب. إذا لم يكن w قابلاً للقسمة على عدد البتات المراد تخزينها، فسيتم إهدار بعض المساحة بسبب التجزئة الداخلية .
تعريف
مصفوفة البتات هي عبارة عن ربط بين نطاق معين (عادةً ما يكون نطاقًا من الأعداد الصحيحة) وقيم في المجموعة.يمكن تفسير القيم على أنها داكن/فاتح، غائب/موجود، مغلق/مفتوح، صالح/غير صالح، وما إلى ذلك. الفكرة هي أنه لا توجد سوى قيمتين محتملتين، لذا يمكن تخزينهما في بت واحد. كما هو الحال مع المصفوفات الأخرى، يمكن إدارة الوصول إلى بت واحد عن طريق تطبيق فهرس على المصفوفة. بافتراض أن حجمها (أو طولها) هو n بت، يمكن استخدام المصفوفة لتحديد مجموعة فرعية من المجال (مثلًاحيث يشير البت 1 إلى وجود رقم في المجموعة، بينما يشير البت 0 إلى عدم وجوده. تستخدم بنية بيانات المجموعة هذه مساحة تقارب n / w كلمة، حيث w هو عدد البتات في كل كلمة من كلمات الآلة . لا يُعدّ تحديد البت ذي الفهرس الأصغر، سواءً كان البت الأقل أهمية (في الكلمة) أو البت الأكثر أهمية، أمرًا بالغ الأهمية، ولكن يُفضّل استخدام البت الأقل أهمية (في الآلات ذات ترتيب البايتات الصغير ).
يمكن تمثيل علاقة ثنائية محدودة بمصفوفة بتات تُسمى مصفوفة منطقية . في حساب العلاقات ، تُركّب هذه المصفوفات بضرب المصفوفات حيث تكون العمليات الحسابية منطقية، ويمثل هذا التركيب تركيب العلاقات . [ 1 ]
العمليات الأساسية
على الرغم من أن معظم الآلات لا تستطيع الوصول إلى البتات الفردية في الذاكرة، ولا تملك تعليمات لمعالجة البتات المفردة، إلا أنه يمكن عزل كل بت في الكلمة ومعالجته باستخدام عمليات البت . على وجه الخصوص:
يُستخدم ORلضبط بت على واحد:
11101 0 10 أو 00000 1 00 = 11101 1 10
ANDلضبط بت على الصفر:
111010 1 0 AND 111111 0 1 = 111010 0 0
ANDلتحديد ما إذا كانت البتة مضبوطة، عن طريق اختبار الصفر:
1110101 0 AND 0000000 1 = 0000000 0 (0 تعني أن البت غير مضبوط) 111010 1 0 AND 000000 1 0 = 000000 1 0 (القيمة غير الصفرية تعني أن البت مضبوط)
XORلعكس أو تبديل البت:
11101 0 10 XOR 00000 1 00 = 11101 1 10 11101 1 10 XOR 00000 1 00 = 11101 0 10
NOTلعكس جميع البتات:
ليس 10110010 = 01001101
للحصول على قناع البت اللازم لهذه العمليات، يمكننا استخدام عامل إزاحة البت لإزاحة الرقم 1 إلى اليسار بالعدد المناسب من المواضع، بالإضافة إلى النفي على مستوى البت إذا لزم الأمر.
بفرض وجود مصفوفتين ثنائيتين من نفس الحجم تمثلان مجموعات، يمكننا حساب اتحادهما وتقاطعهما وفرقهما النظري باستخدام n / w عملية ثنائية بسيطة لكل منهما (2 n / w للفرق)، بالإضافة إلى مكمل أي منهما:
لكل i من 0 إلى n/w-1 complement_a[i] := not a[i] union[i] := a[i] or b[i] intersection[i] := a[i] and b[i] difference[i] := a[i] and ( not b[i])
إذا أردنا المرور على بتات مصفوفة بتات، فيمكننا القيام بذلك بكفاءة باستخدام حلقة متداخلة مزدوجة تمر على كل كلمة، واحدة تلو الأخرى. لا يتطلب الأمر سوى n / w من عمليات الوصول إلى الذاكرة.
لكل i من 0 إلى n/w-1 index := 0 // إذا لزم الأمر كلمة := أ[i] لكل b من 0 إلى w-1 القيمة := الكلمة و 1 ≠ 0 كلمة := كلمة إزاحة لليمين 1 // قم بتنفيذ شيء ما باستخدام القيمة index := index + 1 // إذا لزم الأمر
يُظهر كلا نموذجي الشفرة هذين خاصية مرجعية مثالية ، مما سيؤدي لاحقًا إلى تحسين كبير في الأداء بفضل ذاكرة التخزين المؤقت للبيانات. إذا كان سطر ذاكرة التخزين المؤقت يتكون من k كلمة، فسيحدث حوالي n / wk من حالات عدم الوصول إلى البيانات في ذاكرة التخزين المؤقت.
عمليات أكثر تعقيدا
كما هو الحال مع السلاسل النصية، من السهل تعريف عمليات الطول ، والسلاسل الفرعية ، والمقارنة المعجمية ، والدمج ، والعكس . ويتأثر تنفيذ بعض هذه العمليات بترتيب البايتات .
عدد السكان / وزن هامينغ
إذا أردنا إيجاد عدد البتات التي قيمتها 1 في مصفوفة بتات، وهو ما يُسمى أحيانًا بعدد البتات في الكلمة أو وزن هامينغ، فهناك خوارزميات فعّالة لا تتطلب تفرعات، قادرة على حساب عدد البتات في الكلمة باستخدام سلسلة من عمليات البتات البسيطة. ببساطة، نُطبّق هذه الخوارزمية على كل كلمة ونُسجّل المجموع الكلي. وينطبق الأمر نفسه على عدّ الأصفار. راجع مقال وزن هامينغ للاطلاع على أمثلة لتطبيق فعّال.
الانقلاب
يتطلب قلب الصورة عموديًا، التي تتكون من بت واحد لكل بكسل، أو بعض خوارزميات تحويل فورييه السريع (FFT)، قلب بتات الكلمات الفردية (لذا b31 b30 ... b0تصبح b0 ... b30 b31). عندما لا تكون هذه العملية متاحة على المعالج، يظل من الممكن المتابعة عبر تمريرات متتالية، في هذا المثال على 32 بت:
تبادل كلمتين نصفيتين من 16 بت تبادل البايتات على شكل أزواج (0xddccbbaa -> 0xccddaabb) ... تبديل البتات على شكل أزواج تبديل البتات (b31 b30 ... b1 b0 -> b30 b31 ... b0 b1) يمكن كتابة العملية الأخيرة على النحو التالي ((x&0x55555555) << 1) | (x&0xaaaaaaaa) >> 1)). ابحث عن أول واحد
تُحدد عملية البحث عن أول مجموعة أو أول واحد فهرس أو موضع البت ذي القيمة 1 ذي أصغر فهرس في مصفوفة، وهي مدعومة على نطاق واسع من الأجهزة (للمصفوفات التي لا تتجاوز حجم كلمة واحدة) وتتميز بخوارزميات فعالة لحسابها. عند تخزين قائمة انتظار ذات أولوية في مصفوفة بتات، يمكن استخدام عملية البحث عن أول واحد لتحديد العنصر ذي الأولوية الأعلى في قائمة الانتظار. لتوسيع نطاق عملية البحث عن أول واحد بحجم كلمة واحدة لتشمل مصفوفات أطول، يمكن إيجاد أول كلمة غير صفرية ثم تطبيق عملية البحث عن أول واحد عليها. كما يمكن توسيع العمليات ذات الصلة، مثل البحث عن أول صفر ، وحساب الأصفار البادئة ، وحساب الآحاد البادئة ، وحساب الأصفار اللاحقة ، وحساب الآحاد اللاحقة ، وحساب اللوغاريتم ذي الأساس 2 (انظر البحث عن أول مجموعة )، لتشمل مصفوفة بتات بطريقة مباشرة.
ضغط
تُعدّ مصفوفة البتات أكثر أنواع التخزين كثافةً للبتات "العشوائية"، أي حيث يكون احتمال أن تكون قيمة كل بت صفرًا أو واحدًا متساويًا، وكل بت مستقل. لكن معظم البيانات ليست عشوائية، لذا قد يكون من الممكن تخزينها بشكل أكثر إحكامًا. على سبيل المثال، بيانات صورة الفاكس النموذجية ليست عشوائية ويمكن ضغطها. يُستخدم ترميز طول التشغيل عادةً لضغط هذه التدفقات الطويلة. مع ذلك، يصعب الوصول إلى معظم تنسيقات البيانات المضغوطة عشوائيًا؛ كما أن الضغط المفرط لمصفوفات البتات يُعرّضنا لخطر فقدان مزايا التوازي على مستوى البت ( التوجيه ). لذا، بدلًا من ضغط مصفوفات البتات كتدفقات من البتات، يُمكننا ضغطها كتدفقات من البايتات أو الكلمات (انظر فهرس Bitmap (الضغط) ).
المزايا والعيوب
تتمتع مصفوفات البتات، على الرغم من بساطتها، بعدد من المزايا الملحوظة مقارنة بهياكل البيانات الأخرى لنفس المشكلات:
- إنها مضغوطة للغاية؛ لا توجد هياكل بيانات أخرى يمكنها تخزين n قطعة بيانات مستقلة في n / w كلمة.
- تسمح هذه التقنية بتخزين ومعالجة مجموعات صغيرة من البتات في مجموعة السجلات لفترات طويلة من الزمن دون الحاجة إلى الوصول إلى الذاكرة.
- بسبب قدرتها على استغلال التوازي على مستوى البت، والحد من الوصول إلى الذاكرة، واستخدام ذاكرة التخزين المؤقت للبيانات إلى أقصى حد ، فإنها غالبًا ما تتفوق على العديد من هياكل البيانات الأخرى في مجموعات البيانات العملية، حتى تلك التي تكون أكثر كفاءة من الناحية التقاربية.
لكن المصفوفات الثنائية ليست الحل لكل شيء. على وجه الخصوص:
- بدون ضغط، تُعدّ هذه الهياكل بيانات مُهدرة للموارد، خاصةً للمجموعات المتفرقة (ذات العناصر القليلة مقارنةً بنطاقها)، سواءً من حيث الوقت أو المساحة. في مثل هذه التطبيقات، يُنصح باستخدام مصفوفات البتات المضغوطة، أو مصفوفات جودي ، أو أشجار البحث ، أو حتى مرشحات بلوم .
- قد يكون الوصول إلى العناصر الفردية مكلفًا ويصعب التعبير عنه في بعض لغات البرمجة. إذا كان الوصول العشوائي أكثر شيوعًا من الوصول التسلسلي، وكانت المصفوفة صغيرة نسبيًا، فقد يكون استخدام مصفوفة بايتات أفضل على جهاز يدعم عنونة البايتات. أما استخدام مصفوفة كلمات، فربما لا يكون مبررًا نظرًا لاستهلاكها الكبير للمساحة التخزينية وما يترتب عليه من أخطاء إضافية في ذاكرة التخزين المؤقت، إلا إذا كان الجهاز يدعم عنونة الكلمات فقط.
التطبيقات
نظراً لصغر حجمها، تُستخدم مصفوفات البتات في العديد من التطبيقات في المجالات التي يكون فيها توفير المساحة أو الكفاءة أمراً بالغ الأهمية. ويُستخدم هذا النوع من المصفوفات عادةً لتمثيل مجموعة بسيطة من العلامات المنطقية أو تسلسل مُرتب من القيم المنطقية.
تُستخدم مصفوفات البتات لقوائم الانتظار ذات الأولوية ، حيث يتم تعيين البت الموجود في الفهرس k إذا وفقط إذا كان k موجودًا في قائمة الانتظار؛ يتم استخدام بنية البيانات هذه، على سبيل المثال، بواسطة نواة لينكس ، وتستفيد بشدة من عملية البحث عن أول صفر في الأجهزة.
يمكن استخدام مصفوفات البتات لتخصيص صفحات الذاكرة ، وعقد البيانات ، وقطاعات القرص، وما إلى ذلك. في مثل هذه الحالات، قد يُستخدم مصطلح "خريطة البتات" . ومع ذلك، يُستخدم هذا المصطلح غالبًا للإشارة إلى الصور النقطية ، التي قد تستخدم عدة بتات لكل بكسل .
من التطبيقات الأخرى لمصفوفات البتات مرشح بلوم ، وهو بنية بيانات احتمالية للمجموعات ، قادرة على تخزين مجموعات كبيرة في مساحة صغيرة مقابل احتمال خطأ منخفض. كما يُمكن إنشاء جداول تجزئة احتمالية باستخدام مصفوفات البتات، تقبل إما النتائج الإيجابية الخاطئة أو النتائج السلبية الخاطئة.
تُعدّ مصفوفات البتات والعمليات التي تُجرى عليها مهمةً أيضاً لبناء هياكل بيانات مُختصرة ، تستخدم أقل مساحة ممكنة. في هذا السياق، تكتسب عمليات مثل إيجاد البت رقم 1 رقم n أو عدّ عدد البتات التي قيمتها 1 حتى موضع مُحدد أهميةً بالغة.
تُعدّ مصفوفات البتات أداةً تجريديةً مفيدةً لدراسة تدفقات البيانات المضغوطة ، والتي غالبًا ما تحتوي على عناصر تشغل أجزاءً من البايتات أو لا تكون محاذيةً للبايتات. على سبيل المثال، يمكن أن يتراوح طول تمثيل ترميز هوفمان المضغوط لحرف واحد من 8 بتات بين 1 و255 بتًا.
في مجال استرجاع المعلومات ، تُعدّ مصفوفات البتات تمثيلاً جيداً لقوائم المصطلحات المتكررة بكثرة. إذا قمنا بحساب الفجوات بين القيم المتجاورة في قائمة من الأعداد الصحيحة المتزايدة تماماً، ثمّ قمنا بترميزها باستخدام الترميز الأحادي ، فإنّ النتيجة هي مصفوفة بتات تحتوي على بتّ قيمته 1 في الموضع n إذا وفقط إذا كان n موجوداً في القائمة. الاحتمال الضمني لفجوة مقدارها n هو 1/2 n . هذه أيضاً هي الحالة الخاصة لترميز غولومب حيث يكون المعامل M يساوي 1؛ ويتم اختيار هذا المعامل عادةً فقط عندما يكون −log(2 − p ) / log(1 − p ) ≤ 1 ، أو ما يقارب ذلك، عندما يظهر المصطلح في 38% على الأقل من المستندات.
أمثلة
عند التعامل مع ملف كبير من عناوين IPv4 (أكثر من 100 جيجابايت)، نحتاج إلى حساب العناوين الفريدة. إذا استخدمنا طريقة عامة map[string]bool، فسنحتاج إلى أكثر من 64 جيجابايت من ذاكرة الوصول العشوائي (RAM )، لذا نستخدم خريطة البتات في لغة Go .
الحزمة الرئيسيةيستورد ("bufio""fmt""math/bits""os")// bitsetSize هو عدد البايتات اللازمة لـ 2^32 بت (512 ميجابايت)const bitsetSize = 1 << 29func main () {file , err := os.Open ( " ip_addresses " )إذا كان الخطأ غير فارغ {fmt.Println ( " خطأ في فتح الملف: " , err )يعود}defer file . Close ()مجموعة البت := [ حجم مجموعة البت ] بايت {}// استخدم ماسحًا ضوئيًا مُخزنًا مؤقتًا مع مخزن مؤقت أكبرscanner : = bufio.NewScanner ( file )const maxBuffer = 64 * 1024 // مخزن مؤقت بحجم 64 كيلوبايتbuf := make ([] byte , 0 , maxBuffer )scanner.Buffer ( buf , maxBuffer )// معالجة كل سطرلـ Scanner.Scan ( ) {السطر := الماسح الضوئي . بايتات ()// تحليل عنوان IP يدويًا من البايتاتip := parseIPv4 ( line )// ضبط البتbyteIndex := ip >> 3 // القسمة على 8bitIndex := ip & 7 // موضع البت 0-7bitset [ byteIndex ] |= 1 << bitIndex}// التحقق من أخطاء المسح الضوئيإذا كان هناك خطأ في الماسح الضوئي ، وكان هذا الخطأ غير فارغ ،fmt.Println ( " خطأ في قراءة الملف: " , err )يعود}var count uint64لأني : = 0 ; أنا < حجم البتات ؛ أنا ++ {count += uint64 ( bits . OnesCount8 ( bitset [ i ]))}fmt.Println ( " عدد عناوين IPv4 الفريدة: " , count )}دالة parseIPv4 ( line [] byte ) ( ip uint32 ) {i := 0// ثمانية 1n := uint32 ( line [ i ] - '0' )for i = 1 ; line [ i ] != '.' ; i ++ {n = n * 10 + uint32 ( line [ i ] - '0' )}ip |= n << 24i ++ // تخطي النقطة// ثمانية 2n = uint32 ( line [ i ] - '0' )i ++for ; line [ i ] != '.' ; i ++ {n = n * 10 + uint32 ( line [ i ] - '0' )}ip |= n << 16i ++ // تخطي النقطة// ثمانية 3n = uint32 ( line [ i ] - '0' )i ++for ; line [ i ] != '.' ; i ++ {n = n * 10 + uint32 ( line [ i ] - '0' )}ip |= n << 8i ++ // تخطي النقطة// ثمانية 4n = uint32 ( line [ i ] - '0' )i ++for ; i < len ( line ); i ++ {n = n * 10 + uint32 ( line [ i ] - '0' )}ip |= nعنوان IP المرجعي}الدعم اللغوي
تُدعم مصفوفات البتات على نطاق واسع في لغات البرمجة، إما من خلال واجهات مخصصة أو من خلال إمكانيات معالجة البتات الأكثر عمومية.
تدعم لغة البرمجة APL بشكل كامل مصفوفات البتات ذات الشكل والحجم العشوائيين كنوع بيانات منطقي (Boolean) يختلف عن الأعداد الصحيحة. تقوم جميع التطبيقات الرئيسية ( مثل Dyalog APL وAPL2 وAPL Next وNARS2000 وGnu APL وغيرها) بتجميع البتات بكثافة ضمن حجم كلمة الآلة. يمكن الوصول إلى البتات بشكل فردي باستخدام ترميز الفهرسة المعتاد (على سبيل المثال، `<t> A[3]`)، بالإضافة إلى جميع الدوال والمعاملات الأساسية المعتادة، حيث يتم التعامل معها غالبًا باستخدام خوارزمية خاصة، مثل جمع البتات من خلال البحث في جدول البايتات.
حقول البت في لغة البرمجة C ، وهي كائنات شبهية موجودة في هياكل البيانات بحجم يساوي عددًا معينًا من البتات، هي في الواقع مصفوفات بت صغيرة؛ وهي محدودة في أنها لا تستطيع أن تمتد على كلمات. على الرغم من أنها توفر بنية سهلة، إلا أنه لا يزال يتم الوصول إلى البتات باستخدام عوامل تشغيل على مستوى البايت في معظم الأجهزة، ولا يمكن تعريفها إلا بشكل ثابت (مثل مصفوفات C الثابتة، يتم تحديد أحجامها في وقت الترجمة). من الشائع أيضًا بين مبرمجي C استخدام الكلمات كمصفوفات بت صغيرة والوصول إلى بتاتها باستخدام عوامل تشغيل البت. يُعد ملف الرأس المتاح على نطاق واسع والمضمن في نظام X11 ، طريقةً قابلةً للنقل للأنظمة لتعريف معالجة حقول البت لمصفوفات البت. يمكن العثور على وصف أكثر تفصيلًا للنهج المذكور أعلاه في الأسئلة الشائعة لـ comp.lang.c.<xtrapbits.h>
في لغة C++ ، على الرغم من أن كل boolبت يشغل عادةً نفس مساحة البايت أو العدد الصحيح، فإن نوع STLstd::vector<bool> هذا هو تخصيص جزئي للقالب حيث يتم تجميع البتات لتحسين كفاءة استخدام المساحة. وبما أن البايتات (وليس البتات) هي أصغر وحدة قابلة للعنونة في C++، فإن []المعامل لا يُرجع مرجعًا إلى عنصر، بل يُرجع مرجعًا وسيطًا . قد تبدو هذه نقطة ثانوية، لكنها تعني أن هذا vector<bool>ليس حاوية STL قياسية، ولهذا السبب يُنصح عمومًا بتجنب استخدامه vector<bool>. هناك فئة STL فريدة أخرى std::bitset، [ 2 ]، تُنشئ متجهًا من البتات بحجم ثابت في وقت الترجمة، وتشبه واجهتها وبنيتها استخدام الكلمات كمجموعات بتات في لغة C. كما أنها تتمتع ببعض الميزات الإضافية، مثل القدرة على حساب عدد البتات المُعينة بكفاءة. ومثل المصفوفة ، يجب تحديد حجم المصفوفة في وقت الترجمة، ولا يمكن للمترجم استنتاجه. توفر مكتبات Boost C++ فئة [ 3 ] يتم تحديد حجمها في وقت التشغيل.bitsetboost::dynamic_bitset
توفر لغة البرمجة D مصفوفات البتات في مكتبتها القياسية، Phobos std.bitmanip. وكما هو الحال في لغة C++، فإن عامل التشغيل [] لا يُرجع مرجعًا، نظرًا لأن البتات الفردية لا يمكن الوصول إليها مباشرةً على معظم الأجهزة، ولكنه يُرجع بدلاً من ذلك قيمة bool.
في لغة جافا ، تُنشئ الفئة BitSet( java.util.BitSet) مصفوفة بتات، ثم تُعالج باستخدام دوال تحمل أسماء عوامل التشغيل المنطقية المألوفة لمبرمجي لغة C. على عكس لغة bitsetC++، لا تحتوي مصفوفة جافا BitSetعلى حالة "حجم" (حجمها غير محدود فعليًا، حيث تُهيأ بـ 0 بت)؛ ويمكن تعيين بت أو اختباره عند أي فهرس. إضافةً إلى ذلك، توجد فئة EnumSet( java.util.EnumSet)، التي تُمثل مجموعة من القيم من نوع مُعدّد داخليًا كمتجه بتات، كبديل أكثر أمانًا لحقول البتات.
يوفر إطار عمل .NET فئةً Systems.Collections.BitArrayلتخزين البيانات. تخزن هذه الفئة البتات باستخدام مصفوفة من النوع int(يمثل كل عنصر في المصفوفة عادةً 32 بتًا). [ 4 ] تدعم هذه الفئة الوصول العشوائي ومعاملات البت، ويمكن تكرار عناصرها، كما Lengthيمكن تغيير خصائصها لتوسيعها أو اقتطاعها.
على الرغم من أن لغة Standard ML لا تدعم مصفوفات البتات، إلا أن مكتبة Standard ML of New Jersey تتضمن امتدادًا يُسمى BitArraystructure، وهو موجود في مكتبة SML/NJ الخاصة بها. يتميز هذا الامتداد بحجم غير ثابت، ويدعم عمليات المجموعات وعمليات البتات، بما في ذلك، على نحو غير معتاد، عمليات الإزاحة.
وبالمثل، تفتقر لغة Haskell حاليًا إلى الدعم القياسي للعمليات الثنائية، ولكن كل من GHC و Hugs يوفران Data.Bitsوحدة نمطية تحتوي على وظائف وعوامل ثنائية متنوعة، بما في ذلك عمليات الإزاحة والتدوير، ويمكن استخدام مصفوفة "غير معلبة" على القيم المنطقية لنمذجة مصفوفة بت، على الرغم من أن هذا يفتقر إلى الدعم من الوحدة النمطية السابقة.
في لغة بيرل ، يمكن استخدام السلاسل النصية كمصفوفات بت قابلة للتوسيع. ويمكن معالجتها باستخدام عوامل التشغيل الثنائية المعتادة ( ~ | & ^)، [ 5 ] ويمكن اختبار البتات الفردية وتعيينها باستخدام الدالة vec . [ 6 ]
في لغة روبي ، يمكن الوصول إلى بت من عدد صحيح (أو لا يمكن تعيينه) Fixnumباستخدام Bignumعامل الأقواس ( [])، كما لو كان مصفوفة من البتات.
يدعم Rust استخدام أنواع البيانات الرقمية الأصلية كمصفوفات بت ثابتة العرض باستخدام عمليات البت. توفر مكتبات الطرف الثالث مثل bitvec[ 7 ] واجهات مخصصة.
تحتوي مكتبة Core Foundation الخاصة بشركة Apple على هياكل CFBitVector و CFMutableBitVector .
يدعم PL/I مصفوفات من سلاسل البتات ذات أطوال عشوائية، سواء كانت ثابتة أو متغيرة. يمكن أن تكون عناصر المصفوفة محاذية - حيث يبدأ كل عنصر عند حدود بايت أو كلمة - أو غير محاذية - حيث تتبع العناصر بعضها البعض مباشرةً دون أي مسافة بادئة.
يدعم كل من PL/pgSQL و PostgreSQL سلاسل البتات كنوع بيانات أصلي. يوجد نوعان من بتات SQL: و ، حيث يمثل عددًا صحيحًا موجبًا. [ 8 ]bit(n)bit varying(n)n
تدعم لغات وصف الأجهزة، مثل VHDL و Verilog و SystemVerilog ، متجهات البتات بشكلٍ أصلي، حيث تُستخدم هذه المتجهات لنمذجة عناصر التخزين مثل القلابات ، وحافلات الأجهزة، وإشارات الأجهزة بشكل عام. وفي لغات التحقق من الأجهزة، مثل OpenVera و e و SystemVerilog ، تُستخدم متجهات البتات لأخذ عينات من القيم من نماذج الأجهزة، ولتمثيل البيانات التي تُنقل إلى الأجهزة أثناء عمليات المحاكاة.
توفر لغة Common Lisp مصفوفات بت متعددة الأبعاد. كما توفر تطبيقًا أحادي البعد bit-vectorكحالة خاصة من الدالة المدمجة array، حيث تعمل كفئة ومحدد نوع في آن واحد. [ 9 ] تعتمد مصفوفات البت (وبالتالي متجهات البت) على make-arrayالدالة العامة التي يتم تهيئتها بنوع عنصر من النوع bit، مما يسمح اختياريًا بتحديد متجه البت على أنه قابل لتغيير الحجم ديناميكيًا. bit-vectorومع ذلك، فإن المصفوفة ليست لانهائية في مداها. يوجد نوع أكثر تقييدًا simple-bit-vectorيستبعد صراحةً الخصائص الديناميكية. [ 10 ] يتم تمثيل متجهات البت على شكل ، ويمكن إنشاؤها بطريقة أكثر اختصارًا باستخدام ماكرو القراءة . [ 11 ] بالإضافة إلى الدوال العامة التي تنطبق على جميع المصفوفات، توجد عمليات مخصصة لمصفوفات البت. يمكن الوصول إلى البتات المفردة وتعديلها باستخدام الدالتين و . [ 12 ] كما يتم دعم عدد كبير من العمليات المنطقية. [ 13 ]#*bitsbitsbit
انظر أيضاً
مراجع
- ↑ كوبيلويش، إيرفينغ (ديسمبر 1948). "تطوير المصفوفات لحساب العلاقات". مجلة المنطق الرمزي . 13 (4): 193-203 . JSTOR 2267134 .
- ↑ "تم إيقاف موارد الأرشيف التقني لموقع SGI.com" . SGI . 2 يناير 2018.
- ↑ "dynamic_bitset<Block, Allocator> - 1.66.0" . www.boost.org .
- ↑ "شفرة مصدر .NET mscorlib" . github.com/microsoft . 15 أكتوبر 2021.
- ^ "بيرلوب – perldoc.perl.org" . perldoc.perl.org .
- ↑ "vec - perldoc.perl.org" . perldoc.perl.org .
- ↑ "bitvec - Rust" . docs.rs. تم الاطلاع عليه بتاريخ 2026-01-05 .
- ↑ "8.10. أنواع سلاسل البتات" . 30 سبتمبر 2021.
- ↑ "CLHS: System Class BIT-VECTOR" . www.lispworks.com .
- ↑ "CLHS: Type SIMPLE-BIT-VECTOR" . www.lispworks.com .
- ↑ "CLHS: القسم 2.4.8.4" . www.lispworks.com .
- ↑ "CLHS: Accessor BIT, SBIT" . www.lispworks.com .
- ↑ "CLHS: Function BIT-AND, BIT-ANDC1, BIT-ANDC2..." www.lispworks.com .
روابط خارجية
- الأسس الرياضية. مؤرشفة بتاريخ 16 أكتوبر 2019 في أرشيف الإنترنت (Wayback Machine) بواسطة البروفيسور ديكنوث.
- المتجه < منطقي > غير متوافق، ويفرض اختيار التحسين
- vector <bool> : مشاكل أكثر، حلول أفضل
- المصفوفات
- هياكل البيانات الثنائية
