الأسرار

الأسرار

تمرين تعلّمي

مقدمة

التلاعب بالبتات

توفّر Java عوامل لمعالجة بتات byte وshort وint وlong أو char.

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

استخدم << لإزاحة البتات نحو اليسار و>> للإزاحة نحو اليمين.

// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100

// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010

يُدخل العامل << أصفارًا دائمًا على الجانب الأيمن. أما >> فإنه يُدخل البتة نفسها الموجودة في أقصى اليسار (1 إذا كان العدد سالبًا أو 0 إذا كان موجبًا).

// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;

// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001

استخدم >>> بدلًا من ذلك عندما نريد إدخال أصفار عند الإزاحة نحو اليمين.

// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001

عمليات البتات

AND البتّي

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

0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
OR البتّي

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

0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
XOR البتّي

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

0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
NOT البتّي (~)

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

~0b0110_0101;
// # => 0b1001_1010

التعليمات

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

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

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

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

Secrets.shiftBack(0b1001, 2);
# => 0b0010

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

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

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

Secrets.setBits(0b0110, 0b0101);
# => 0b0111

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

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

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

Secrets.flipBits(0b1100, 0b0101);
# => 0b1001

4. امسح بتات محددة

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

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

Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Java Exercism

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

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