الأسرار

الأسرار

تمرين تعلّمي

مقدمة

العمليات البتّية

تتيح لنا العمليات البتّية التلاعب بالخانات الفردية داخل الأعداد الثنائية.

توفّر لغة Elm عدة عوامل بتّية في وحدة Bitwise

العمليات الأساسية

تعديل البتات الفردية في عدد ما يُسمّى التقنيع. القناع عدد ضُبطت فيه بتات محددة بطريقة معينة للتلاعب بعدد آخر باستخدام عوامل بتّية مثل and وor وxor.

and

يدمج and بين عددين مع الاحتفاظ فقط بالبتات التي تساوي 1 في كليهما. وهذا مفيد للتحقق مما إذا كانت بتة فردية مضبوطة. مثلًا، للتحقق مما إذا كانت البتة الرابعة في عدد ما مضبوطة على 1، طبّق عليه and مع قناع قيمته 01000 (أي 8 في النظام العشري) وانظر هل النتيجة غير صفرية:

Bitwise.and 13 8 --> 8
--  13 = 01101
--   8 = 01000
-- and = 01000 = 8
or

يدمج or بين عددين بضبط كل بتة على 1 إذا كانت تساوي 1 في أحد العددين أو في كليهما. وهذا مفيد لضبط بتة معينة على 1. مثلًا، لضبط البتة الثانية في 10101، طبّق عليها or مع القناع 00010:

Bitwise.or 21 2 --> 23
-- 21 = 10101
--  2 = 00010
-- or = 10111 = 23
أو الحصرية (xor)

يدمج xor بين عددين بضبط كل بتة على 1 إذا كانت تساوي 1 في أحد العددين و0 في الآخر. وهذا مفيد لقلب بتة إلى قيمتها المعاكسة:

Bitwise.xor 20 5 --> 17
--  20 = 10100
--   5 = 00101
-- xor = 10001 = 17
المتمّم

يعكس complement كل بتة في عدد ما (0 تصبح 1، و1 تصبح 0).

لاحظ أن هذا سيؤدي إلى أن تصبح الأعداد الموجبة سالبة، والأعداد السالبة موجبة. وذلك لأن الأعداد السالبة في النظام الثنائي تُمثَّل بـ 1 في الخانة الواقعة في أقصى اليسار.

Bitwise.complement 21 --> -22
--         21 = 00000000000000000000000000010101
-- complement = 11111111111111111111111111101010 = -22
إزاحة البتات

تنقل العوامل التالية البتات إلى اليسار أو إلى اليمين بعدد محدد من المواضع، ما يعادل عمليًا الضرب في قوى العدد 2 أو القسمة عليها.

تنقل shiftLeftBy البتات إلى اليسار، وتملأ الفراغ بـ 0 من جهة اليمين. مثلًا، لإزاحة 21 إلى اليسار بمقدار 3 مواضع:

Bitwise.shiftLeftBy 3 21 --> 168
--  21 = 10101
-- shiftLeftBy 3 = 10101000 = 168

وهذا مثل القول 21 * 2^3 = 21 * 2 * 2 * 2 = 168

shiftRightBy: تنقل البتات إلى اليمين:

Bitwise.shiftRightBy 2 21 --> 5
--  21 = 10101
-- shiftRightBy 2 = 00101 = 5

الإزاحة إلى اليمين بمقدار 2 من المواضع تعادل القسمة الصحيحة على 4.

لاحظ أن هذه الدالة تنسخ القيمة الموجودة في البتة الواقعة في أقصى اليسار. لذا ستبقى الأعداد السالبة سالبة:

Bitwise.shiftRightBy 3 -21 --> -3
--  -21 = 111...101011
-- shiftRightBy 3 = 111...11101 = -3

إذا أردت الإزاحة إلى اليمين مع الملء بالأصفار، فاستخدم shiftRightZfBy:

Bitwise.shiftRightZfBy 3 -21 --> 536870909
--  -21 = 111...101011
-- shiftRightZfBy 3 = 00111...11101 = 536870909

التعليمات

أرسل لك صديقك للتو رسالة تحوي سرًّا مهمًّا. ولأنه لم يرغب في تسهيل قراءتها على الآخرين، شُفّرت الرسالة عبر مجموعة من عمليات التلاعب بالبتات. ستحتاج إلى كتابة الدوال للمساعدة في فك تشفير الرسالة.

1. إزاحة البتات إلى الخلف

الخطوة الأولى في فك تشفير الرسالة هي التراجع عن الإزاحة التي حدثت في عملية التشفير، وذلك بإزاحة البتات إلى اليمين. ستوجد خطوات لاحقة في عملية فك التشفير تفترض إدراج 0 من الجانب الأيسر.

نفّذ الدالة shiftBack التي تأخذ عدد المواضع المراد الإزاحة بها وقيمة، وتقوم بالإزاحة.

shiftBack 2 42 --> 10

2. ضبط بعض البتات

بعد ذلك، هناك بعض البتات التي يجب ضبطها على 1.

نفّذ الدالة setBits التي تأخذ قناعًا وقيمة وتُرجع نتيجة ضبط البتات في القيمة على 1. يجب ضبط البت في القيمة على 1 عندما يكون البت المقابل في القناع أيضًا 1. مع إبقاء جميع البتات الأخرى دون تغيير.

setBits 66 212 --> 64

3. قلب بتات محددة

تُقلب بعض البتات أثناء التشفير. وسيلزم قلبها مرة أخرى لفك تشفير الرسالة.

نفّذ الدالة flipBits التي تأخذ قناعًا وقيمة. يشير القناع إلى البتات التي يجب قلبها في القيمة. إذا كان البت في القناع هو 1، يُقلب البت المقابل في القيمة. وتُبقى جميع البتات الأخرى دون تغيير.

flipBits 23 157 --> 138

4. تصفير بتات محددة

هناك أيضًا بتات معينة تفك تشفيرها دائمًا إلى 0.

نفّذ الدالة clearBits التي تأخذ قناعًا وقيمة. يجب ضبط البتات في value على 0 عندما يكون البت في القناع هو 1. مع إبقاء جميع البتات الأخرى دون تغيير.

clearBits 2 15 --> 13

5. فك تشفير رسالة

الآن بعد أن أصبحت لديك كل الدوال التي تحتاجها، يمكنك فك تشفير رسالة صديقك. نفّذ الدالة decrypt التي تنفّذ العمليات التالية:

  1. اضبط البتات من السنة التي وُلد فيها صديقك (1996)
  2. اقلب الناتج بالسنة التي التقيتما فيها لأول مرة (2009)
  3. أزح البتات إلى الخلف بعدد الحصص التي تحضرانها معًا (5)
  4. صفّر البت الأول والخامس.
decrypt 380182 --> 11840

يُرجى تنفيذ الدالة decrypt باستخدام جميع الدوال التي نفّذتها في المهام السابقة.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elm Exercism

مستعد لبدء الأسرار؟

سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.