تتيح لنا العمليات البتّية التلاعب بالخانات الفردية داخل الأعداد الثنائية.
توفّر لغة Elm عدة عوامل بتّية في وحدة Bitwise
تعديل البتات الفردية في عدد ما يُسمّى التقنيع.
القناع عدد ضُبطت فيه بتات محددة بطريقة معينة للتلاعب بعدد آخر باستخدام عوامل بتّية مثل and وor وxor.
يدمج and بين عددين مع الاحتفاظ فقط بالبتات التي تساوي 1 في كليهما.
وهذا مفيد للتحقق مما إذا كانت بتة فردية مضبوطة.
مثلًا، للتحقق مما إذا كانت البتة الرابعة في عدد ما مضبوطة على 1، طبّق عليه and مع قناع قيمته 01000 (أي 8 في النظام العشري) وانظر هل النتيجة غير صفرية:
Bitwise.and 13 8 --> 8
-- 13 = 01101
-- 8 = 01000
-- and = 01000 = 8
يدمج or بين عددين بضبط كل بتة على 1 إذا كانت تساوي 1 في أحد العددين أو في كليهما.
وهذا مفيد لضبط بتة معينة على 1.
مثلًا، لضبط البتة الثانية في 10101، طبّق عليها or مع القناع 00010:
Bitwise.or 21 2 --> 23
-- 21 = 10101
-- 2 = 00010
-- or = 10111 = 23
يدمج 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
أرسل لك صديقك للتو رسالة تحوي سرًّا مهمًّا. ولأنه لم يرغب في تسهيل قراءتها على الآخرين، شُفّرت الرسالة عبر مجموعة من عمليات التلاعب بالبتات. ستحتاج إلى كتابة الدوال للمساعدة في فك تشفير الرسالة.
الخطوة الأولى في فك تشفير الرسالة هي التراجع عن الإزاحة التي حدثت في عملية التشفير، وذلك بإزاحة البتات إلى اليمين.
ستوجد خطوات لاحقة في عملية فك التشفير تفترض إدراج 0 من الجانب الأيسر.
نفّذ الدالة shiftBack التي تأخذ عدد المواضع المراد الإزاحة بها وقيمة، وتقوم بالإزاحة.
shiftBack 2 42 --> 10
بعد ذلك، هناك بعض البتات التي يجب ضبطها على 1.
نفّذ الدالة setBits التي تأخذ قناعًا وقيمة وتُرجع نتيجة ضبط البتات في القيمة على 1.
يجب ضبط البت في القيمة على 1 عندما يكون البت المقابل في القناع أيضًا 1.
مع إبقاء جميع البتات الأخرى دون تغيير.
setBits 66 212 --> 64
تُقلب بعض البتات أثناء التشفير. وسيلزم قلبها مرة أخرى لفك تشفير الرسالة.
نفّذ الدالة flipBits التي تأخذ قناعًا وقيمة.
يشير القناع إلى البتات التي يجب قلبها في القيمة.
إذا كان البت في القناع هو 1، يُقلب البت المقابل في القيمة.
وتُبقى جميع البتات الأخرى دون تغيير.
flipBits 23 157 --> 138
هناك أيضًا بتات معينة تفك تشفيرها دائمًا إلى 0.
نفّذ الدالة clearBits التي تأخذ قناعًا وقيمة.
يجب ضبط البتات في value على 0 عندما يكون البت في القناع هو 1.
مع إبقاء جميع البتات الأخرى دون تغيير.
clearBits 2 15 --> 13
الآن بعد أن أصبحت لديك كل الدوال التي تحتاجها، يمكنك فك تشفير رسالة صديقك.
نفّذ الدالة decrypt التي تنفّذ العمليات التالية:
decrypt 380182 --> 11840
يُرجى تنفيذ الدالة decrypt باستخدام جميع الدوال التي نفّذتها في المهام السابقة.
سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.