قناع (حوسبة)
في علوم الحاسوب ، القناع أو قناع البت هو بيانات تُستخدم في عمليات البت ، وخاصةً في حقل البت . باستخدام القناع، يمكن تفعيل أو تعطيل بتات متعددة في بايت ، أو نصف بايت ، أو كلمة ، وما إلى ذلك، أو عكس حالتها من التفعيل إلى التعطيل (أو العكس) في عملية بت واحدة. يُستخدم القناع أيضًا في التنبؤ في معالجة المتجهات ، حيث يُستخدم قناع البت لتحديد عناصر المتجه التي سيتم تنفيذها (بت القناع مُفعّل) وتلك التي لن يتم تنفيذها (بت القناع غير مُفعّل).
وظائف قناع البت الشائعة
إخفاء البتات إلى1
لتفعيل بتات معينة، يمكن استخدام عملية البت ، وفقًا ORلمبدأ أن لكل بت Y ، يكون Y = 0 Y OR 1 = 1و Y OR 0 = YY = 0. لذلك، للتأكد من تفعيل بت، ORيمكن استخدام Y مع Y = 0. 1ولترك بت دون تغيير، ORيُستخدم Y مع Y = 0 0.
مثال: إخفاء النصف العلوي ( البتات 4، 5، 6، 7) مع ترك النصف السفلي (البتات 0، 1، 2، 3) دون تغيير.
1001 0101 1010 0101 أو 1111 0000 1111 0000 = 1111 0101 1111 0101
إخفاء البتات إلى0
في أغلب الأحيان، تُحجب البتات ( أو تُحجب إلى 0) بدلاً من أن تُفعّل ( أو تُحجب إلى 1). عندما يُعالج بت ANDبصفر، تكون النتيجة دائمًا صفرًا Y AND 0 = 0. ولترك البتات الأخرى كما كانت في الأصل، يمكن ANDمعالجتها 1بـY AND 1 = Y
مثال: إخفاء النصف العلوي ( البتات 4، 5، 6، 7) مع ترك النصف السفلي (البتات 0، 1، 2، 3) دون تغيير.
1001 0101 1010 0101 AND 0000 1111 0000 1111 = 0000 0101 0000 0101
الاستعلام عن حالة بت
يمكن استخدام أقنعة البت للتحقق بسهولة من حالة بتات فردية بغض النظر عن حالة البتات الأخرى. وللقيام بذلك، ANDيتم إيقاف تشغيل جميع البتات الأخرى باستخدام عملية البت كما هو موضح أعلاه، ثم تُقارن القيمة مع البت المقابل 0. إذا كانت القيمة تساوي صفرًا 0، فهذا يعني أن البت كان مُطفأً، أما إذا كانت القيمة أي قيمة أخرى، فهذا يعني أن البت كان مُفعلاً. ما يجعل هذه الطريقة ملائمة هو أنه ليس من الضروري معرفة القيمة الفعلية، بل يكفي التأكد من أنها ليست صفرًا 0.
مثال: الاستعلام عن حالة البت الرابع
1001 1 101 1001 0 101 AND 0000 1 000 0000 1 000 = 0000 1 000 0000 0 000
تبديل قيم البتات
حتى الآن، تناولت المقالة كيفية تفعيل البتات وإيقافها، ولكن ليس كليهما في آن واحد. أحيانًا لا يهمّ ما هي القيمة، بل يجب عكسها. يمكن تحقيق ذلك باستخدام عملية XOR(أو الحصرية) . XORتُرجع هذه العملية قيمة صحيحة 1فقط إذا كان عدد البتات التي قيمتها فردية1 . لذلك، إذا كانت قيمتا بتتين متناظرتين صفرًا 1، ستكون النتيجة صفرًا 0، ولكن إذا كانت قيمة إحداهما فقط صفرًا 1، ستكون النتيجة صفرًا 1. بالتالي، يتم عكس قيم البتات XORبعكسها باستخدام عملية (أو الحصرية). 1إذا كانت قيمة البت الأصلية صفرًا 1، تُرجع العملية صفرًا 1 XOR 1 = 0. وإذا كانت قيمة البت الأصلية صفرًا، 0تُرجع العملية صفرًا 0 XOR 1 = 1. تجدر الإشارة أيضًا إلى أن XORعملية الإخفاء آمنة على مستوى البتات، أي أنها لن تؤثر على البتات غير المقنعة Y XOR 0 = Y، تمامًا كما هو الحال مع عملية (أو الحصرية) OR.
مثال: تبديل قيم البتات
10011101 10010101 XOR 00001111 11111111 = 10010010 01101010
لكتابة قيم عشوائية من 1 و 0 لمجموعة فرعية من البتات، اكتب أولاً 0 لتلك المجموعة الفرعية، ثم قم بتعيين البتات العليا:
register = (register & ~bitmask) | value;
دمج البتات
في بعض الأحيان، يجب نسخ بتات محددة دون تغيير البتات الأخرى في سجل أو وحدة تخزين. ويمكن التعبير عن ذلك، على سبيل المثال، كما يلي:
، أو
الوجهة = (الوجهة و~القناع البتي) | (المصدر والقناع النقطي)؛
في هذا المثال، يحتوي قناع البت على 0 حيث تبقى بتات الوجهة ، و 1 حيث يتم استبدالها ببتات المصدر .
(إذا كان المصدر يحتوي فقط على البتات التي سيتم إدراجها، فيمكن حذف جزء قناع البت & .)
استخدامات أقنعة البت

الوسائط للدوال
في لغات البرمجة مثل C ، تُعدّ حقول البتات وسيلةً مفيدةً لتمرير مجموعة من الوسائط المنطقية المُسماة إلى دالة. على سبيل المثال، في واجهة برمجة تطبيقات الرسومات OpenGL ، يوجد أمرٌ glClear()يمسح الشاشة أو المخازن المؤقتة الأخرى. يمكنه مسح ما يصل إلى أربعة مخازن مؤقتة (مخزن اللون، ومخزن العمق، ومخزن التراكم، ومخزن الاستنسل )، لذا كان بإمكان مطوري واجهة برمجة التطبيقات جعله يقبل أربعة وسائط. ولكن حينها سيبدو استدعاءه كالتالي:
glClear ( 1 , 1 , 0 , 0 ); // هذه ليست الطريقة التي تعمل بها glClear فعليًا، وسيؤدي ذلك إلى كود غير مستقر.وهذا ليس وصفًا دقيقًا. بدلًا من ذلك، هناك أربعة بتات حقل مُعرَّفة، وهي: GL_COLOR_BUFFER_BIT، ، GL_DEPTH_BUFFER_BIT، GL_ACCUM_BUFFER_BIT، و GL_STENCIL_BUFFER_BIT، ويتم glClear()تعريفها على النحو التالي:
void glClear ( GLbitfield bits );ثم يبدو استدعاء الدالة على النحو التالي:
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );داخليًا، يمكن لدالة تأخذ حقل بتات كهذا استخدام النظام الثنائي لاستخراج البتات الفردية. على سبيل المثال، قد يبدو andتنفيذ ذلك كما يلي:glClear()
void glClear ( GLbitfield bits ) { if (( bits & GL_COLOR_BUFFER_BIT ) != 0 ) { // مسح مخزن الألوان. } if (( bits & GL_DEPTH_BUFFER_BIT ) != 0 ) { // مسح مخزن العمق. } if (( bits & GL_ACCUM_BUFFER_BIT ) != 0 ) { // مسح مخزن التراكم. } if (( bits & GL_STENCIL_BUFFER_BIT ) != 0 ) { // مسح مخزن الاستنسل. } }تتمثل ميزة هذا الأسلوب في تقليل الحمل الزائد لوسائط الدالة. بما أن الحد الأدنى لحجم البيانات هو بايت واحد، فإن فصل الخيارات إلى وسائط منفصلة سيؤدي إلى إهدار سبعة بتات لكل وسيط، وسيشغل مساحة أكبر من الذاكرة. بدلاً من ذلك، تقبل الدوال عادةً عددًا صحيحًا واحدًا أو أكثر من 32 بت، مع ما يصل إلى 32 بتًا للخيارات في كل منها. على الرغم من أناقة هذا الحل، إلا أنه في أبسط تطبيقاته غير آمن من حيث النوع . يُعرَّف A GLbitfieldببساطة على أنه unsigned int، لذا سيسمح المترجم باستدعاء غير ذي معنى لـ glClear(42)أو حتى glClear(GL_POINTS). في لغة C++، يتمثل البديل في إنشاء فئة لتغليف مجموعة الوسائط التي يمكن أن تقبلها glClear، والتي يمكن تغليفها بشكل منظم في مكتبة.
الأقنعة المعكوسة
تُستخدم الأقنعة مع عناوين IP في قوائم التحكم بالوصول (ACLs) لتحديد ما يُسمح به وما يُمنع. لتكوين عناوين IP على الواجهات، تبدأ الأقنعة بـ 255، وتكون القيم الكبيرة على الجانب الأيسر: على سبيل المثال، عنوان IP 203.0.113.129 مع قناع 255.255.255.224 . أما أقنعة قوائم التحكم بالوصول فهي معكوسة: على سبيل المثال، القناع 0.0.0.255 . يُسمى هذا أحيانًا بالقناع العكسي أو قناع الأحرف البديلة . عند تحليل قيمة القناع إلى النظام الثنائي (أصفار وواحدات)، تُحدد النتائج أي بتات العنوان يجب أخذها في الاعتبار عند معالجة حركة البيانات. يشير البت 0 إلى وجوب أخذ بت العنوان في الاعتبار (مطابقة تامة)؛ بينما يتم تجاهل البت 1 في القناع.
على سبيل المثال: عنوان الشبكة (حركة البيانات المراد معالجتها): 192.0.2.0مع القناع: 0.0.0.255. في النظام الثنائي، يكون العنوان هو 11000000.00000000.00000010.00000000والقناع هو 00000000.00000000.00000000.11111111.
استنادًا إلى القناع الثنائي، يتضح أن أول ثلاث مجموعات ( ثمانيات ) يجب أن تتطابق تمامًا مع عنوان الشبكة الثنائي المُعطى 11000000.00000000.00000010. أما المجموعة الأخيرة من الأرقام فيتجاهلها القناع. وبالتالي، تتم مطابقة جميع البيانات التي تبدأ بـ " ". لذلك، باستخدام هذا القناع، تتم معالجة 192.0.2.عناوين الشبكة 192.0.2.1من 192.0.2.255إلى .192.0.2.x
يُحدد طرح القناع العادي من 255.255.255.255القناع العكسي لقائمة التحكم بالوصول (ACL). في هذا المثال، يُحدد القناع العكسي لعنوان الشبكة 198.51.100.0ذي القناع العادي التالي 255.255.255.0:
255.255.255.255 − 255.255.255.0 = 0.0.0.255 (قناع عادي) (قناع معكوس)
مكافئات الرباط الصليبي الأمامي
يعني المصدر/المصدر-الرمز "أي".0.0.0.0/255.255.255.255
مصدر/رمز البدل هو نفسه "المضيف ".198.51.100.2/0.0.0.0198.51.100.2
أقنعة الصور

في مجال رسومات الحاسوب ، عند الرغبة في وضع صورة معينة فوق خلفية، يمكن تحديد المناطق الشفافة باستخدام قناع ثنائي. [ 1 ] وبهذه الطريقة، لكل صورة مُراد وضعها، يوجد في الواقع صورتان نقطيتان : الصورة الأصلية، حيث تُعطى المناطق غير المستخدمة قيمة بكسل تكون جميع بتاتها أصفارًا، وقناع إضافي ، حيث تُعطى مناطق الصورة المقابلة قيمة بكسل تكون جميع بتاتها أصفارًا، بينما تُعطى المناطق المحيطة قيمة تكون جميع بتاتها واحدًا. في المثال على اليمين، تحتوي البكسلات السوداء على بتات أصفار، بينما تحتوي البكسلات البيضاء على بتات واحد.
أثناء التشغيل ، لوضع الصورة على الشاشة فوق الخلفية، يقوم البرنامج أولاً بإخفاء بتات بكسلات الشاشة باستخدام قناع الصورة عند الإحداثيات المطلوبة عبر عملية AND المنطقية . هذا يحافظ على بكسلات الخلفية للمناطق الشفافة، بينما يُعيد ضبط بتات البكسلات التي ستُحجب بالصورة المُتراكبة إلى الصفر.
بعد ذلك، يقوم البرنامج بمعالجة بتات بكسلات الصورة بدمجها مع بتات بكسلات الخلفية باستخدام عملية "أو" المنطقية . وبهذه الطريقة، يتم وضع بكسلات الصورة في أماكنها الصحيحة مع الحفاظ على بكسلات الخلفية المحيطة بها. والنتيجة هي دمج مثالي للصورة مع الخلفية.

تُستخدم هذه التقنية لرسم مؤشرات أجهزة التأشير ، وفي ألعاب الفيديو ثنائية الأبعاد النموذجية للشخصيات والرصاص وما إلى ذلك (الرسومات المتحركة )، ولأيقونات واجهة المستخدم الرسومية ، ولعناوين الفيديو وتطبيقات دمج الصور الأخرى. وهناك طريقة أسرع تتمثل في استبدال بكسلات الخلفية ببكسلات المقدمة إذا كانت قيمة ألفا الخاصة بها تساوي 1.
على الرغم من ارتباطها (بسبب استخدامها لنفس الأغراض)، فإن الألوان الشفافة وقنوات ألفا هي تقنيات لا تتضمن مزج بكسل الصورة عن طريق الإخفاء الثنائي.
جداول التجزئة
لإنشاء دالة تجزئة لجدول تجزئة ، غالبًا ما تُستخدم دالة ذات نطاق واسع. ولإنشاء فهرس من مخرجات هذه الدالة، يمكن استخدام عملية باقي القسمة (modulo) لتقليل حجم النطاق ليُطابق حجم المصفوفة؛ ومع ذلك، غالبًا ما يكون من الأسرع على العديد من المعالجات تقييد حجم جدول التجزئة إلى قوى العدد اثنين واستخدام قناع بت بدلاً من ذلك.
مثال على كل من عملية حساب باقي القسمة والإخفاء في لغة C:
#include <stdint.h> #include <stdlib.h> #include <string.h>// دالة تجزئة uint32_t hashFunction ( char * token , size_t len , uint32_t bucketCount );int main ( void ) { const uint32_t NUM_BUCKETS = 0xFFFFFFFF ; // 2^32 - 1 const uint32_t MAX_RECORDS = 1 << 10 ; // 2^10 const uint32_t HASH_BITMASK = 0x3FF ; // 2^10 - 1 const size_t TOKEN_COUNT = 100 ; // مثال على الحجمchar * tokens [] = ( char ** ) malloc ( sizeof ( char * ) * TOKEN_COUNT ); // إدارة تخصيص الذاكرة للرموز...char token [] = "some hashable value" ; uint32_t hashedToken = hashFunction ( token , strlen ( token ), NUM_BUCKETS );// باستخدام باقي القسمة: size_t index = hashedToken % MAX_RECORDS ;// أو باستخدام قناع البت: size_t index = hashedToken & HASH_BITMASK ;tokens [ index ] = token ;// تحرير الذاكرة من الرموز المميزة... free ( tokens ); return 0 ; }انظر أيضاً
مراجع
- ↑ "Mask R-CNN with OpenCV" . PyImageSearch . 2018-11-19 . تم الاطلاع عليه بتاريخ 2020-04-05 .
- الحساب الثنائي
