الأسرار

الأسرار

تمرين تعلّمي

مقدمة

توفّر Crystal عوامل على مستوى البتات للتعامل مع Int على المستوى الثنائي.

عوامل الإزاحة

توفّر Crystal عوامل الإزاحة لإزاحة البتات نحو اليسار (<<) أو نحو اليمين (>>).

الإزاحة إلى اليسار (<<)

يُزيح عامل الإزاحة إلى اليسار (<<) البتات نحو اليسار. تُحدَّد القيمة المراد إزاحتها على الجانب الأيسر، وعدد المواضع المراد الإزاحة بها على الجانب الأيمن.

0b0010 << 1
# => 0b0100

0b0010 << 2
# => 0b1000

إذا كان العدد سالبًا، فسيُزيح نحو اليمين بدلًا من ذلك.

0b0010 << -1
# => 0b0001

الإزاحة إلى اليمين (>>)

يُزيح عامل الإزاحة إلى اليمين (>>) البتات نحو اليمين. وكما في عامل الإزاحة إلى اليسار، تُحدَّد القيمة المراد إزاحتها على الجانب الأيسر، وعدد المواضع المراد الإزاحة بها على الجانب الأيمن.

0b0100 >> 1
# => 0b0010

0b0100 >> 2
# => 0b0001

وبالمثل، سيُزيح العامل نحو اليسار إذا كان العدد سالبًا.

0b0100 >> -1
# => 0b1000

العوامل الثنائية

توفّر Crystal ثلاثة عوامل ثنائية (&، |، ^) وعامل ~ لإجراء عمليات على مستوى البتات.

AND على مستوى البتات (&)

يُنفّذ العامل الثنائي AND (&) عملية AND على مستوى البتات على قيمتين. يقارن كل بت في القيمة الأولى بالبت في الموضع نفسه في القيمة الثانية. وتُضبط البتة الناتجة على 1 إذا كانت كلتا البتتين 1. وإلا فإنها تُضبط على 0.

0b0011 & 0b1010
# => 0b0010

OR على مستوى البتات (|)

يُنفّذ العامل الثنائي OR (|) عملية OR على مستوى البتات على قيمتين. وهو أيضًا يقارن كل بت في القيمة الأولى بالبت في الموضع نفسه في القيمة الثانية. إذا كانت إحدى البتتين 1، فتُضبط البتة الناتجة على 1. وإلا فإنها تُضبط على 0.

0b0011 | 0b1010
# => 0b1011

XOR على مستوى البتات (^)

يُنفّذ العامل الثنائي XOR (^) عملية XOR على مستوى البتات. وكما في عاملي AND وOR على مستوى البتات، يقارن كل بت من القيمة الأولى بالبت في الموضع نفسه في القيمة الثانية. إذا كانت واحدة فقط منهما 1، فالبتة الناتجة 1. وإلا فإنها 0.

0b0011 ^ 0b1010
# => 0b1001

NOT على مستوى البتات (~)

أخيرًا، يقلب عامل NOT على مستوى البتات (~) كل بت من بتات القيمة. وعلى عكس العوامل الثنائية الأخرى، هذا عامل أحادي، يعمل على القيمة الواقعة إلى اليمين فقط.

~0b1110_0010
# => 0b0001_1101

التعليمات

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

1. إعادة إزاحة البتات

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

نفّذ الطريقة Secrets.shift_back التي تأخذ قيمة وعدد المواضع التي ستُزاح إلى اليسار.

Secrets.shift_back(0b0001, 2)
# => 0b0100

2. تطبيق قناع البتات

الخطوة التالية هي تطبيق قناع بتات لاستخراج قيمة بتات معينة. يُطبَّق القناع عن طريق إجراء عملية AND على مستوى البتات بين القيمة والقناع.

نفّذ الطريقة Secrets.apply_mask التي تأخذ قيمة وتُطبّق عليها قناعًا.

Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100

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

أدّت إزاحة البتات إلى اليسار إلى إضافة بعض البتات الجديدة ذات القيمة 0. يجب ضبط بعض هذه البتات الجديدة على 1. تُفيد عملية OR على مستوى البتات في ضبط بتات معينة على 1 مع الحفاظ على بقية البتات.

نفّذ الطريقة Secrets.set_bits التي تأخذ قيمتين وتُجري عملية OR على مستوى البتات.

Secrets.set_bits(0b0110, 0b0101)
# => 0b111

4. عكس XOR

يتضمن جزء من عملية التشفير تطبيق XOR مع قيمة متفق عليها. وللعودة إلى القيمة الأصلية، يكفي تطبيق XOR مرة أخرى على القيمة المشفّرة مع القيمة المتفق عليها. لكن بسبب سوء فهم، قلب صديقك بتات القيمة المتفق عليها (أي طبّق عملية NOT على مستوى البتات على القيمة المتفق عليها) قبل تطبيق XOR.

نفّذ الطريقة Secrets.reverse_xor التي تأخذ القيمة المشفّرة والقيمة المتفق عليها وتحسب القيمة الأصلية.

Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Crystal Exercism

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

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