راية البتات

من ويكي
اذهب إلى: تصفح، ابحث

راية البتات bit flags هو نمط شائع الإستخدام في البرمجة يستخدم البتات لتخزين القيم المنطقية.

مثال

لو كانا نريد تمثيل الجهات الأربعة في متغير، فيمكننا استخدام أربعة متغيرات منطقية boolean، أو يمكننا الاستفادة من الرايات وتمثيلها هكذا:

EAST  = 1 << 0 # 1
WEST  = 1 << 1 # 2
NORTH = 1 << 2 # 4
SOUTH = 1 << 3 # 8

الإزاحة << ستحرك الواحد لليسار بعدد مرات اليمين، مثلاً لو فرضنا أن حجم البيانات 4 بت فإن 1 << 3 سيصبح في الثنائي 10002 أو 4 في النظام العشري، هكذا كل متغير سيشغل بت لوحده:

EAST  => 0001
WEST  => 0010
NORTH => 0100
SOUTH => 1000

إسناد القيم

لو أردنا تخزين الشرق والغرب، فيمكننا دمجها باستخدام العملية الثنائية OR هكذا EAST | WEST:

0001
0010 OR أو |
====
0011

ستلاحظ أن بتات الشرق والغرب مرفوعة.

التحقق من راية

لو أتانا المتغير x وأردنا التحقق مما إذا كانت راية الغرب مرفوعة فيمكننا استخدام العملية AND أو & مع الغرب هكذا (x & WEST) == WEST أو الأفضل (x & WEST) != 0 ستكون النتيجة:

0011
0010 AND أو &
====
0010

يرجى الإنتباه أنه في C/C++ العملية & أوليتها أقل من == و != خلافاً لمعظم لغات البرمجة، بمعنى أن x & WEST != 0 يكافئ x & (WEST != 0) وليس (x & WEST) != 0.

حذف راية

لنفترض أن لدينا متغير x = WEST | SOUTH، قيمته طبعاً ستكون 10102، لو أردت حذف الراية WEST فيمكن هذا إما باستخدام x & ~WEST:

 1010
~0010 &
 ====
 1010
 1101 &
 ====
 1000

البعض قد يستخدم XOR هكذا x ^ WEST:

1010
0010 XOR أو ^
====
1000

الفارق بين الطريقتين هو أن الأخيرة يجب أن تكون متأكد من أن الراية فعلاً موجودة وإلا فإن استخدام XOR سترفع الراية بدلاً من الحذف مثلاً x ^ NORTH = 1110 تلاحظ أن البت الثالث من اليمين أصبح 1، بينما NOT-AND لاتعاني من هذه المشكلة x & ~NORTH = 1010، لذا من الأفضل استخدامها.

ملاحظات

يمكن التأكد من وجود رايتين وأكثر بكتابة (x & (NORTH | EAST | ...)) != 0، لحذف رايتين وأكثر x = x & ~(NORTH | EAST | ...).

استخدام الرايات يمكننا من توفير عدد المتغيرات، لكن انتبه أنك يجب أن تضع حجم المتغير في الاعتبار، فلو كان حجم المتغير 32 بت، فلن يمكنك تخزين أكثر من 32 راية، واحدة لكل بت.