أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول
البرمجة بالعربي

Bitwise و Bitmask للمبتدئ: خزّن 32 صلاحية في رقم واحد

📅 ٢١ مايو ٢٠٢٦⏱ 7 دقائق قراءة
Bitwise و Bitmask للمبتدئ: خزّن 32 صلاحية في رقم واحد

مستوى المقال: مبتدئ. الشرح يبدأ من الصفر بمثال لوحة مفاتيح الكهرباء، وما بيفترضش أي خلفية سابقة عن النظام الثنائي. لو انت مبتدئ تمامًا، المقال ده مكتوب ليك بالظبط.

لو عندك 4 متغيرات boolean بتتنقل مع بعض في الكود — زي canRead و canWrite و canDelete و canShare — تقدر تحطهم كلهم في رقم صحيح واحد. ده مش حيلة ذكية للاستعراض، ده اسمه bitmask، وبيوفّر مساحة تخزين وبيخلّي فحص الصلاحية يتعمل في عملية واحدة.

Bitwise و Bitmask: ازاي تخزّن 32 صلاحية في رقم واحد

المقال ده هيشرحلك حاجتين مترابطتين: الـ Bitwise operators (العمليات اللي بتشتغل على البتات مباشرة)، والـ Bitmask (استخدام البتات دي عشان تخزّن مجموعة حالات on/off في رقم واحد). هتطلع بكود JavaScript شغّال تقدر تنسخه وتجرّبه دلوقتي.

المشكلة باختصار

تخيّل تطبيق فيه نظام صلاحيات. الطريقة الشائعة: عمود boolean منفصل لكل صلاحية في قاعدة البيانات. عمود can_read، عمود can_write، وهكذا. الطريقة دي بتفشل لما عدد الصلاحيات يكبر: كل صلاحية جديدة معناها ALTER TABLE على جدول ممكن يكون فيه ملايين الصفوف، وكل فحص بيقرا أعمدة كتير. الـ bitmask بيحل ده بعمود رقمي واحد.

ثمانية بتات في صف واحد، أربعة مضيئة بقيمة 1 وأربعة مطفأة بقيمة 0، تحت عنوان Bitwise و Bitmask مع تحويل 10110100 إلى 180

الأول: إيه هو الـ 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. بنستخدمه عشان نضيف صلاحية.
  • XOR (الرمز ^): الـ XOR بيشغّل المفتاح لو هو مختلف بين اللوحتين. القاعدة الدقيقة: الـ bit بيطلع 1 لو الرقمين مختلفين في الخانة دي. بنستخدمه عشان نقلب صلاحية: لو موجودة تتشال، ولو غايبة تتحط.
  • NOT (الرمز ~): بيقلب كل المفاتيح؛ المشغّل يطفي والمطفي يشتغل.

وفيه عملية مساعدة مهمة: الإزاحة لليسار (<<). الأمر 1 << 3 معناه «خُد الرقم 1 وحرّكه 3 خانات لليسار»، فبيطلع 00001000 أي العدد 8. ده بيدّينا طريقة نظيفة نبني بيها قناع لأي خانة بنحددها.

الاستخدام العملي: نظام صلاحيات في رقم واحد

دلوقتي نجمّع الكلام ده في كود فعلي. كل صلاحية هتاخد bit مخصص ليها، وكل صلاحيات المستخدم هتتخزّن في متغير واحد.

  1. عرّف لكل صلاحية قيمة تساوي 1 << رقم الخانة.
  2. اجمع صلاحيات المستخدم بـ |.
  3. افحص أي صلاحية بـ &.
  4. أضف بـ |، واسحب بـ & ~، واقلب بـ ^.
JavaScript
// كل صلاحية = bit مخصص، نبنيها بـ 1 << رقم الخانة
const READ   = 1 << 0;  // 1  -> 00000001
const WRITE  = 1 << 1;  // 2  -> 00000010
const DELETE = 1 << 2;  // 4  -> 00000100
const SHARE  = 1 << 3;  // 8  -> 00001000

// صلاحيات مستخدم جديد: READ + WRITE + SHARE
let perms = READ | WRITE | SHARE;       // النتيجة: 11

// فحص: هل يقدر يكتب؟
if (perms & WRITE) {
  console.log("WRITE: مسموح");           // هتتنفّذ
}

// فحص صلاحية غير موجودة
console.log(Boolean(perms & DELETE));    // false

// إضافة صلاحية الحذف
perms = perms | DELETE;                 // بقت 15

// سحب صلاحية الكتابة
perms = perms & ~WRITE;                 // الـ bit اتشال

// قلب صلاحية المشاركة (موجودة، فتتشال)
perms = perms ^ SHARE;

السطر perms & WRITE هو لُب الفكرة: عملية واحدة بترجّع رقم، لو مش صفر يبقى الصلاحية موجودة. الرسم اللي تحت بيوضّح ازاي 8 صلاحيات منفصلة بتتحوّل لـ byte واحد قيمته رقم محدد.

ثماني صلاحيات READ و WRITE و SHARE و COMMENT بمفاتيح تشغيل تتجمّع في بايت واحد قيمته 75

الأرقام: ليه الطريقة دي أخف وأسرع

التخزين. في PostgreSQL، عمود boolean بياخد بايت كامل. لو عندك 24 صلاحية يبقى ده 24 بايت لكل صف. بدّلها بعمود integer واحد = 4 بايت بس، وبيشيل لحد 32 صلاحية. التوفير هنا حوالي 6 أضعاف. ولو احتجت أكتر، bigint بـ 8 بايت بيشيل 64 صلاحية.

السرعة. عملية الـ bitwise الواحدة هي تعليمة معالج واحدة، بتتنفّذ في حدود دورة ساعة واحدة — أقل من نانوثانية على معالج بسرعة 3GHz. قارن ده بفحص 24 عمود boolean منفصل اللي بيتطلّب 24 قراءة.

سيناريو واقعي. لو عندك تطبيق SaaS فيه 40,000 مستخدم وكل واحد ليه 24 إعداد، الفرق بين 24 عمود boolean وعمود integer واحد هو فرق في حجم الجدول وفي كل عملية قراءة. والأهم: إضافة الإعداد رقم 25 مع الـ bitmask مفيهاش ALTER TABLE أصلاً طول ما لسه فيه bits فاضية — بتعرّف ثابت جديد في الكود وخلاص.

الـ trade-offs: بتكسب إيه وبتخسر إيه

الـ bitmask مش مجاني. الـ trade-off هنا واضح وصريح:

  • بتخسر القراءة. الرقم 11 ميقولش لحد إنه يعني READ و WRITE و SHARE. لازم طبقة في الكود تترجمه. الأعمدة المنفصلة بتشرح نفسها بنفسها.
  • بتخسر سهولة الاستعلام. فلترة في SQL زي WHERE perms & 4 > 0 غالبًا بتعمل full scan، لأن الـ index العادي مبيشتغلش على نتيجة عملية bitwise.
  • فيه حد أقصى. integer بيوقف عند 32 صلاحية، و bigint عند 64. أكتر من كده محتاج حل تاني.
  • الأخطاء بتبقى صامتة. لو كتبت 1 << 5 وانت قاصد 1 << 4، مفيش رسالة خطأ. الكود هياخد قرار غلط بهدوء.

متى لا تستخدم Bitmask

متستخدموش لو عندك 2 أو 3 صلاحيات بس — هنا الوضوح أهم من توفير بايتات قليلة. ومتستخدموش لو محتاج تعمل فلترة وتقارير كتير على صلاحيات منفردة؛ في الحالة دي أعمدة منفصلة مع index هتكون أسرع في الاستعلام. وفكّر مرتين لو الفريق فيه مبتدئين كتير ومحدش هيقرا الكود ده مرتاح بعد 6 شهور. الافتراض اللي بُني عليه المقال: إنك بتشتغل بلغة فيها أعداد صحيحة عادية (JavaScript أو Python أو Go أو C)، وإن عدد الـ flags عندك أقل من أو يساوي 32.

الخطوة التالية

افتح أقرب ملف في مشروعك فيه 4 متغيرات boolean أو أكتر بتتنقل مع بعض كـ parameters أو جوّه object واحد. حوّلهم لثوابت بصيغة 1 << n، وخزّنهم في متغير واحد. شغّل الكود اللي فوق، بدّل القيم، وراقب ازاي perms & FLAG بترد. لو الناتج طلع زي ما هو متوقّع، يبقى انت فهمت الـ bitmask فعلاً.

المصادر

  • توثيق MDN الرسمي من Mozilla — Bitwise operators في JavaScript.
  • مواصفة ECMAScript الرسمية (ECMA-262) — أقسام Bitwise NOT و AND و OR و XOR والإزاحة لليسار.
  • توثيق PostgreSQL 16 الرسمي — Numeric Types و Data Type Storage (أحجام boolean و integer و bigint).
  • كتاب «Hacker's Delight» لـ Henry S. Warren — مرجع كلاسيكي في خوارزميات معالجة البتات.

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة