مستوى المقال: مبتدئ. الشرح يبدأ من الصفر بمثال لوحة مفاتيح الكهرباء، وما بيفترضش أي خلفية سابقة عن النظام الثنائي. لو انت مبتدئ تمامًا، المقال ده مكتوب ليك بالظبط.
لو عندك 4 متغيرات boolean بتتنقل مع بعض في الكود — زي canRead و canWrite و canDelete و canShare — تقدر تحطهم كلهم في رقم صحيح واحد. ده مش حيلة ذكية للاستعراض، ده اسمه bitmask، وبيوفّر مساحة تخزين وبيخلّي فحص الصلاحية يتعمل في عملية واحدة.
Bitwise و Bitmask: ازاي تخزّن 32 صلاحية في رقم واحد
المقال ده هيشرحلك حاجتين مترابطتين: الـ Bitwise operators (العمليات اللي بتشتغل على البتات مباشرة)، والـ Bitmask (استخدام البتات دي عشان تخزّن مجموعة حالات on/off في رقم واحد). هتطلع بكود JavaScript شغّال تقدر تنسخه وتجرّبه دلوقتي.
المشكلة باختصار
تخيّل تطبيق فيه نظام صلاحيات. الطريقة الشائعة: عمود boolean منفصل لكل صلاحية في قاعدة البيانات. عمود can_read، عمود can_write، وهكذا. الطريقة دي بتفشل لما عدد الصلاحيات يكبر: كل صلاحية جديدة معناها ALTER TABLE على جدول ممكن يكون فيه ملايين الصفوف، وكل فحص بيقرا أعمدة كتير. الـ bitmask بيحل ده بعمود رقمي واحد.
الأول: إيه هو الـ bit؟ — مثال لوحة مفاتيح الكهرباء
تخيّل لوحة على الحيط فيها 8 مفاتيح كهرباء في صف واحد. كل مفتاح إما لفوق (مشغّل) أو لتحت (مطفي). لو حبّيت تسجّل حالة اللوحة كلها في ورقة، ممكن تكتب 8 أسطر: «مفتاح المطبخ مشغّل، مفتاح الصالة مطفي...». أو — وده المهم — تكتب رقم واحد يلخّص الصف كله.
الـ bit بالظبط زي المفتاح ده. هو أصغر وحدة معلومة في الكمبيوتر، وقيمته إما 0 (مطفي) أو 1 (مشغّل). لما تصفّ 8 بتات جنب بعض بيتكوّن عندك byte. وكل خانة في الصف ليها وزن: الخانة الأولى من اليمين قيمتها 1، اللي بعدها 2، ثم 4، ثم 8، 16، وهكذا — كل خانة ضِعف اللي قبلها. ده اسمه النظام الثنائي. فالصف 00001011 معناه 8 + 2 + 1 = 11.
التعريف العلمي: الـ Bitwise Operators
الـ Bitwise operators هي عمليات بتشتغل على كل bit لوحده داخل الرقم. أربعة منها هيهموك كمبتدئ. هنشرح كل واحد بمثال المفاتيح الأول، وبعدها القاعدة الدقيقة.
- AND (الرمز
&): تخيّل بتقارن لوحتين مفاتيح. الـ AND بيشغّل المفتاح في النتيجة بس لو هو مشغّل في الاتنين. القاعدة الدقيقة: الـ bit بيطلع 1 لو الـ bit المقابل ليه يساوي 1 في الرقمين معًا. بنستخدمه عشان نفحص هل صلاحية معيّنة موجودة. - OR (الرمز
|): الـ OR بيشغّل المفتاح لو هو مشغّل في أي واحدة من اللوحتين. القاعدة الدقيقة: الـ bit بيطلع 1 لو واحد على الأقل من الرقمين فيه 1. بنستخدمه عشان نضيف صلاحية.