أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالمناهج والباقات
أحمد حايس

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

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

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

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • المناهج والباقات
  • المدونة

الدعم

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

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

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

Bitmask للمبتدئ: ليه chmod 755 رقم واحد بيخزّن 9 صلاحيات

مبتدئ٢٠ يونيو ٢٠٢٦5 دقائق قراءة
Bitmask للمبتدئ: ليه chmod 755 رقم واحد بيخزّن 9 صلاحيات

Bitmask: ازاي رقم واحد بيخزّن صلاحيات كتير ويفحصها في خطوة واحدة

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

لو خلّصت المقال ده هتعرف تخزّن 10 صلاحيات بوولين في عمود رقم واحد بدل 10 أعمدة، وتفحص أي صلاحية منهم في عملية واحدة. ده بالظبط اللي بيخلّي chmod 755 يلخّص 9 صلاحيات في 3 أرقام.

رسم توضيحي لصلاحيات الملف rwx على هيئة تسع خانات ثنائية تتحول إلى الأمر chmod 755

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

تخيّل عندك جدول مستخدمين، وكل مستخدم ليه صلاحيات: يقرأ، يكتب، يحذف، يدير، يصدّر تقارير... وهكذا. الطريقة الشائعة إنك تعمل عمود بوولين لكل صلاحية. الطريقة دي بتفشل لما الصلاحيات تكبر: 30 صلاحية يبقى 30 عمود، وكل migration جديد معناه عمود جديد وتعديل في الكود في كذا مكان. Bitmask بيحل ده بفكرة واحدة: خزّن كل الصلاحيات في رقم صحيح واحد.

مثال قبل النظرية: صف لمبات

تخيّل عندك صف فيه 3 لمبات على الحيطة. كل لمبة إما مولّعة (1) أو مطفية (0). لو قرأت الصف من الشمال لليمين، حالة اللمبات ممكن تتكتب كرقم: مثلاً مولّعة - مطفية - مولّعة يبقى 101.

دلوقتي سمِّ كل لمبة باسم صلاحية: اللمبة الأولى "قراءة"، التانية "كتابة"، التالتة "تنفيذ". الرقم 101 معناه: عنده قراءة، ماعندوش كتابة، عنده تنفيذ. لمبة واحدة بتمثّل صلاحية واحدة، وحالة الصف كله رقم واحد. ده هو الـ Bitmask بالظبط: كل بِت (لمبة) بيمثّل صلاحية.

المفهوم علميًا: كل بِت صلاحية مستقلة

الكمبيوتر بيخزّن الأرقام في النظام الثنائي (binary)، يعني سلسلة من 0 و 1، كل خانة منهم اسمها bit. الرقم 6 بيتخزّن كـ 110، والرقم 5 كـ 101. Bitmask هو إننا نتعامل مع كل بِت كعَلَم (flag) مستقل بيقول "الصلاحية دي شغّالة ولا لأ".

عشان نشغّل ونفحص البِتات بنستخدم عمليات على مستوى البِت (bitwise):

  • OR (|) للدمج: بيشغّل أي بِت شغّال في أي من الطرفين. بنستخدمه عشان نضيف صلاحية.
  • AND (&) للفحص: بيدّي 1 بس لو البِت شغّال في الطرفين. بنستخدمه عشان نسأل "هل الصلاحية دي موجودة؟".
  • NOT (~) مع AND للسحب: عشان نطفّي صلاحية معيّنة.
مخطط يوضح دمج صلاحيتي READ وWRITE بمعامل OR لتنتج 6 ثم فحص صلاحية WRITE بمعامل AND

الكود: دمج وفحص وسحب الصلاحيات

الكود ده شغّال على أي Python 3. خلّينا نعرّف 3 صلاحيات، كل واحدة بِت لوحدها (نفس ترتيب rwx):

Python
READ    = 0b100  # 4  ->  100
WRITE   = 0b010  # 2  ->  010
EXECUTE = 0b001  # 1  ->  001

# اعطِ المستخدم قراءة + كتابة (دمج بـ OR)
perms = READ | WRITE          # = 6  ->  110

# هل عنده صلاحية الكتابة؟ (فحص بـ AND)
print(bool(perms & WRITE))     # True   (110 & 010 = 010 = 2)

# هل عنده صلاحية التنفيذ؟
print(bool(perms & EXECUTE))   # False  (110 & 001 = 000 = 0)

# اسحب صلاحية الكتابة (AND مع المعكوس)
perms = perms & ~WRITE        # = 4  ->  100
print(bin(perms))              # 0b100  (فضل عنده القراءة بس)

لاحظ إن كل العمليات دي بتشتغل على رقم واحد جوّه المتغير perms، مش على 3 متغيرات منفصلة. ده اللي بيخلّيها سريعة ومرتبة.

السيناريو الواقعي بالأرقام

لو عندك جدول فيه مليون مستخدم و 50 صلاحية بوولين: في PostgreSQL كل عمود BOOLEAN بياخد بايت واحد على الأقل، يعني 50 بايت لكل صف، حوالي 50 ميجابايت للجدول كله غير الفهارس. لو حوّلتهم لعمود BIGINT واحد (بيشيل لحد 64 صلاحية)، بقى 8 بايت لكل صف، يعني 8 ميجابايت تقريبًا — توفير حوالي 84% في تخزين الصلاحيات. وأهم من المساحة: إضافة صلاحية جديدة بقت سطر ثابت جديد في الكود من غير migration على قاعدة البيانات.

الفكرة دي مش نظرية. صلاحيات Discord بتتخزّن كـ bitfield في رقم واحد، ونظام الملفات في Linux بيخزّن rwx لـ 3 فئات (المالك، المجموعة، الباقي) في الرقم اللي بتشوفه في chmod 755: 7 = 111 (rwx)، 5 = 101 (r-x).

الـ trade-offs

Bitmask بيكسبك تخزين أصغر ودمج وفحص في عملية واحدة، بس بتدفع تمن:

  • القراءة أصعب على البني آدم. perms = 6 أقل وضوحًا من can_write = true. لازم اسم ثابت (constant) لكل بِت عشان الكود يفضل مفهوم.
  • الاستعلام في SQL بقى أعقد. "هات كل مين عنده صلاحية الكتابة" بتتحوّل لـ WHERE perms & 2 > 0، وده غالبًا مش هيستخدم index عادي بكفاءة.
  • سقف محدد. BIGINT بيشيل 64 صلاحية. أكتر من كده محتاج نوع أكبر أو bitset مخصّص.

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

متستخدمهوش لو الصلاحيات قليلة وثابتة (2 أو 3) ومش هتكبر — وقتها 3 أعمدة بوولين أوضح وأسهل في الاستعلام. وكمان متستخدمهوش لو محتاج تعمل فلترة وبحث ثقيل على صلاحية واحدة في ملايين الصفوف بشكل متكرر؛ هنا العمود المفهرس المنفصل بيكون أسرع. Bitmask بيلمع لما يكون عندك صلاحيات كتير، بتتقرا وتتعدّل مع بعض كوحدة واحدة.

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

افتح أي صلاحية بوولين عندك في الكود، واعمل لها constant بقيمة قوة 2 (1، 2، 4، 8...)، وجرّب تدمج اتنين منهم بـ | وتفحصهم بـ & في سكربت صغير زي اللي فوق. لو فهمت ليه 6 & 2 بتطلّع 2 و 6 & 1 بتطلّع 0، يبقى مسكت الفكرة كلها.

المصادر

  • توثيق GNU Coreutils — أوضاع الملفات الرقمية في chmod: https://www.gnu.org/software/coreutils/manual/html_node/Numeric-Modes.html
  • توثيق Python الرسمي — العمليات على البِت (Bitwise Operations): https://docs.python.org/3/library/stdtypes.html#bitwise-operations-on-integer-types
  • توثيق مطوّري Discord — الصلاحيات كـ bitfield: https://discord.com/developers/docs/topics/permissions
  • Wikipedia — Mask (computing): https://en.wikipedia.org/wiki/Mask_(computing)

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

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

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