الدرس 4 من 9

العمليات على البتات

هدف الدرس

الأقنعة والإزاحة تفكّ البايت

01

الشرح

كثيرًا ما يحمل البايت الواحد عدّة معلومات، كأعلام (flags) في بتات منفردة، أو رقمين صغيرين في نصفيه. ولتفكّه تحتاج العمليات على البتات (bitwise operations):

  • العملية a & b (AND) تُبقي البت 1 إن كان 1 في العددين معًا.
  • العملية a | b (OR) تجعل البت 1 إن كان 1 في أحدهما.
  • العملية a ^ b (XOR) تجعل البت 1 إن اختلف البتّان.
  • الإزاحة a << n تنقل البتات إلى اليسار n خانات، فتضرب العدد في 2 مرفوعًا للأسّ n.
  • الإزاحة a >> n تنقلها إلى اليمين، فتقسم العدد وتُسقط الكسر.
  • العملية ~a تقلب كل البتات.

والقناع (bitmask) رقم تختار به البتات التي تريدها. فالقناع 0x0f وهو 0000 1111 يعزل النصف الأدنى من البايت، والإزاحة >> 4 تُنزل النصف الأعلى إلى مكانه:

  1010 0110      flags = 0xA6
& 0000 1111      mask  = 0x0f
= 0000 0110      low   = 6

  1010 0110 >> 4 = 0000 1010      high = 10

ولتعرف هل البت رقم n مرفوع اعزله بقناعه ثم قارن بالصفر، والعدّ يبدأ من اليمين بالصفر. ولتقلب بتًّا واحدًا طبّق XOR مع قناعه. وانتبه إلى أن العملية ~ في Python تعطي عددًا سالبًا، فاقنعه بـ 0xff لتبقى داخل البايت:

(flags & (1 << n)) != 0    # هل البت n مرفوع
flags ^ (1 << n)            # يقلب البت n
~flags & 0xff               # يقلب كل البتات
02

المطلوب

اكتب الدالة parse_flags(b) لتُرجع من البايت b صفًّا من أربع قيم بهذا الترتيب: نصفه الأعلى، ونصفه الأدنى، وهل البت رقم 5 مرفوع (True أو False)، والبايت بعد قلب البت رقم 0. ثم فكّ بها flags في المتغيّرات high وlow وis_set وtoggled.

الفحوص

5 فحوص
  1. المتغيّر high النصف الأعلى
  2. المتغيّر low النصف الأدنى
  3. المتغيّر is_set قيمة منطقية صحيحة
  4. المتغيّر toggled بعد قلب البت صفر
  5. الدالة parse_flags تعمل على بايتات أخرى
03

تلميحات

0/3
main.py
المخرجاتPython (Pyodide)

نحمّل بيئة Python الآن. يحدث هذا مرّة واحدة فقط، ثم يحفظها متصفّحك.

–/5

يبدأ الفحص حين تجهز البيئة.

تجد 5 فحوص في بطاقة «المطلوب».