توفّر Crystal عوامل على مستوى البتات للتعامل مع Int على المستوى الثنائي.
توفّر Crystal عوامل الإزاحة لإزاحة البتات نحو اليسار (<<) أو نحو اليمين (>>).
<<)يُزيح عامل الإزاحة إلى اليسار (<<) البتات نحو اليسار.
تُحدَّد القيمة المراد إزاحتها على الجانب الأيسر، وعدد المواضع المراد الإزاحة بها على الجانب الأيمن.
0b0010 << 1
# => 0b0100
0b0010 << 2
# => 0b1000
إذا كان العدد سالبًا، فسيُزيح نحو اليمين بدلًا من ذلك.
0b0010 << -1
# => 0b0001
>>)يُزيح عامل الإزاحة إلى اليمين (>>) البتات نحو اليمين.
وكما في عامل الإزاحة إلى اليسار، تُحدَّد القيمة المراد إزاحتها على الجانب الأيسر، وعدد المواضع المراد الإزاحة بها على الجانب الأيمن.
0b0100 >> 1
# => 0b0010
0b0100 >> 2
# => 0b0001
وبالمثل، سيُزيح العامل نحو اليسار إذا كان العدد سالبًا.
0b0100 >> -1
# => 0b1000
توفّر Crystal ثلاثة عوامل ثنائية (&، |، ^) وعامل ~ لإجراء عمليات على مستوى البتات.
&)يُنفّذ العامل الثنائي AND (&) عملية AND على مستوى البتات على قيمتين.
يقارن كل بت في القيمة الأولى بالبت في الموضع نفسه في القيمة الثانية.
وتُضبط البتة الناتجة على 1 إذا كانت كلتا البتتين 1.
وإلا فإنها تُضبط على 0.
0b0011 & 0b1010
# => 0b0010
|)يُنفّذ العامل الثنائي OR (|) عملية OR على مستوى البتات على قيمتين.
وهو أيضًا يقارن كل بت في القيمة الأولى بالبت في الموضع نفسه في القيمة الثانية.
إذا كانت إحدى البتتين 1، فتُضبط البتة الناتجة على 1.
وإلا فإنها تُضبط على 0.
0b0011 | 0b1010
# => 0b1011
^)يُنفّذ العامل الثنائي XOR (^) عملية XOR على مستوى البتات.
وكما في عاملي AND وOR على مستوى البتات، يقارن كل بت من القيمة الأولى بالبت في الموضع نفسه في القيمة الثانية.
إذا كانت واحدة فقط منهما 1، فالبتة الناتجة 1.
وإلا فإنها 0.
0b0011 ^ 0b1010
# => 0b1001
~)أخيرًا، يقلب عامل NOT على مستوى البتات (~) كل بت من بتات القيمة.
وعلى عكس العوامل الثنائية الأخرى، هذا عامل أحادي، يعمل على القيمة الواقعة إلى اليمين فقط.
~0b1110_0010
# => 0b0001_1101
لقد أرسل لك صديقك للتو رسالة تحتوي على سر مهم. ولأنه لا يريد تسهيل قراءتها على الآخرين، فقد شُفّرت الرسالة باستخدام مجموعة من عمليات معالجة البتات. ستحتاج إلى كتابة برنامج يساعدك على فك تشفير الرسالة.
الخطوة الأولى في فك تشفير الرسالة هي إلغاء الإزاحة التي أُجريت أثناء التشفير بإزاحة البتات إلى اليسار مرة أخرى. قد يختلف عدد المواضع التي تُزاح بها البتات من رسالة إلى أخرى.
نفّذ الطريقة Secrets.shift_back التي تأخذ قيمة وعدد المواضع التي ستُزاح إلى اليسار.
Secrets.shift_back(0b0001, 2)
# => 0b0100
الخطوة التالية هي تطبيق قناع بتات لاستخراج قيمة بتات معينة.
يُطبَّق القناع عن طريق إجراء عملية AND على مستوى البتات بين القيمة والقناع.
نفّذ الطريقة Secrets.apply_mask التي تأخذ قيمة وتُطبّق عليها قناعًا.
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
أدّت إزاحة البتات إلى اليسار إلى إضافة بعض البتات الجديدة ذات القيمة 0.
يجب ضبط بعض هذه البتات الجديدة على 1.
تُفيد عملية OR على مستوى البتات في ضبط بتات معينة على 1 مع الحفاظ على بقية البتات.
نفّذ الطريقة Secrets.set_bits التي تأخذ قيمتين وتُجري عملية OR على مستوى البتات.
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
XOR
يتضمن جزء من عملية التشفير تطبيق XOR مع قيمة متفق عليها.
وللعودة إلى القيمة الأصلية، يكفي تطبيق XOR مرة أخرى على القيمة المشفّرة مع القيمة المتفق عليها.
لكن بسبب سوء فهم، قلب صديقك بتات القيمة المتفق عليها (أي طبّق عملية NOT على مستوى البتات على القيمة المتفق عليها) قبل تطبيق XOR.
نفّذ الطريقة Secrets.reverse_xor التي تأخذ القيمة المشفّرة والقيمة المتفق عليها وتحسب القيمة الأصلية.
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
سجّل في Exercism لتتعلّم وتتقن Crystal عبر 26 مفهومًا142 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.