العمليات على البتات في C++: كيفية تعيين وإعادة تعيين وتبديل بت

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمليات على البتات في C++: كيفية تعيين وإعادة تعيين وتبديل بت واحد (دون أن تفقد صوابك)



مرحبًا، أيها الزميل! إذا كنت قد نظرت يومًا إلى كود شخص آخر بلغة C++ ورأيت رموزًا غريبة مثل | و & و ~، ثم تساءلت "لماذا يفعلون هذا؟" — فأنت في المكان الصحيح. اليوم سنقوم بتحليل أحد أكثر المواضيع شيوعًا (وبصراحة، من أكثرها أناقة) في البرمجة: العمليات على البتات. وبالتحديد — كيفية تعيين وإعادة تعيين وتبديل بت واحد.



هذا ليس مجرد تمرين أكاديمي. العمل مع البتات هو قوة خارقة ستفيدك في كل مكان: من العمل مع أعلام التكوين و أطراف المتحكمات الدقيقة إلى تحسين تخزين البيانات في الألعاب أو قواعد البيانات. على Stack Overflow، حصل هذا السؤال على مئات الآلاف من المشاهدات — مما يعني أنه مهم حقًا.



دعنا نتجاوز النظرية المملة — مباشرة إلى العمل. هيا بنا!



لماذا نعمل مع البتات أساسًا؟



تخيل أن لديك 8 إعدادات مختلفة (مثل تشغيل الصوت، عرض التلميحات، تشغيل الوضع الليلي، إلخ). يمكنك تخزينها في ثمانية متغيرات منفصلة من نوع bool. لكن هذا يعني 8 بايت (أو أكثر). بينما يمكنك استخدام بايت واحد — 8 بتات، كل منها مسؤول عن إعداد معين. توفير في الذاكرة بمقدار 8 مرات — وهذه مجرد البداية.



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



في لغة C++، تُستخدم ثلاثة عوامل رئيسية للعمل مع البتات:

  • | (أو البتي) — لـ تعيين البت.
  • & (و البتي) — لـ إعادة تعيين البت.
  • ^ (أو الحصري البتي، XOR) — لـ تبديل البت.


وعامل مفيد آخر — ~ (ليس البتي)، الذي يعكس جميع البتات. سنحتاجه لإعادة التعيين.



ترقيم البتات: دعنا نتفق فورًا



في البرمجة، من المعتاد ترقيم البتات بدءًا من الصفر. البت الأقل أهمية (Least Significant Bit, LSB) هو البت 0. البت الأكثر أهمية (Most Significant Bit, MSB) هو البت 7 للبايت، و15 للكلمة (16 بت)، وهكذا.



في هذه المقالة، سنستخدم uint8_t (عدد صحيح غير موقع 8 بت) للتوضيح. لكن جميع الأمثلة تعمل أيضًا مع int و unsigned int و uint32_t وأي أنواع أعداد صحيحة أخرى.



كيفية تعيين بت (Set bit)



تعيين بت يعني جعله يساوي 1، بغض النظر عن قيمته السابقة.



أسهل طريقة هي استخدام أو البتي مع قناع. القناع هو رقم يتم فيه تعيين البت الذي نريد تغييره فقط.



الصيغة:

العدد |= (1 << رقم_البت);


دعنا نحللها خطوة بخطوة:

  1. 1 << رقم_البت — نزيح الواحد إلى اليسار بعدد المواضع المطلوب. إذا كان رقم البت = 3، فإن 1 << 3 يعطي الثنائي 00001000.
  2. العدد | قناع — عملية أو ستجعل البت يساوي 1 إذا كان 0، وستبقيه 1 إذا كان بالفعل 1.


مثال كود بلغة C++:

#include <iostream>#include <cstdint>

int main() { uint8_t flags = 0b00000000; // في البداية جميع البتات معاد تعيينها

// تعيين البت الثالث (نعد من الصفر) flags |= (1 << 3);

// الآن flags = 0b00001000 std::cout << "بعد تعيين البت 3: " << static_cast<int>(flags) << std::endl;

// تعيين البت 0 flags |= (1 << 0); // flags = 0b00001001 std::cout << "بعد تعيين البت 0: " << static_cast<int>

المدونات

توصيات الكتب