الدرس 4 من 9
العمليات على البتات
- 13 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الأقنعة والإزاحة تفكّ البايت
الشرح
كثيرًا ما يحمل البايت الواحد عدّة معلومات، كأعلام (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 # يقلب كل البتات
المطلوب
اكتب الدالة parse_flags(b) لتُرجع من البايت b صفًّا من أربع قيم بهذا الترتيب: نصفه الأعلى، ونصفه الأدنى، وهل البت رقم 5 مرفوع (True أو False)، والبايت بعد قلب البت رقم 0. ثم فكّ بها flags في المتغيّرات high وlow وis_set وtoggled.
الفحوص
5 فحوص- المتغيّر high النصف الأعلى
- المتغيّر low النصف الأدنى
- المتغيّر is_set قيمة منطقية صحيحة
- المتغيّر toggled بعد قلب البت صفر
- الدالة parse_flags تعمل على بايتات أخرى