ما معنى XOR (الأو الحصري) في الخوارزميات وهياكل البيانات؟
XOR (اختصار لـ exclusive or أي «الأو الحصري»، ويُكتب أحيانًا ⊕) هي عملية منطقية تأخذ مدخلين وتُعيد صحيحًا (1) فقط عندما يختلف المدخلان، وتُعيد خطأً (0) عندما يتساويان. أي أن الناتج يكون 1 إذا كان أحدهما 1 والآخر 0 حصريًا، لا الاثنان معًا. هذه القاعدة البسيطة هي سرّ حضور XOR القوي في التشفير والتلاعب بالبتات وبعض أذكى الحيل في هياكل البيانات.
كثيرون يخلطون بين XOR وبين OR العادية. الفرق الوحيد لكنه جوهري: عندما يكون المدخلان 1 و1، تُعيد OR القيمة 1، بينما تُعيد XOR القيمة 0. لهذا يُسمّى «الحصري»: يقبل أحدهما لا كليهما.
جدول الحقيقة لعملية XOR
| المدخل A | المدخل B | ناتج XOR (A ⊕ B) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
القاعدة الذهنية الأسهل: الناتج 1 إذا اختلف البتّان، و0 إذا تطابقا. يمكنك أيضًا اعتبار XOR جمعًا ثنائيًا بدون حمل (carry).
مقارنة سريعة: OR أم XOR؟
| العملية | متى تُعيد 1؟ | مثال 1 و1 | استخدام شائع |
|---|---|---|---|
OR (|) | إذا كان أحد المدخلين 1 على الأقل | 1 | تجميع أعلام (flags) |
XOR (^) | إذا كان أحد المدخلين 1 حصريًا | 0 | القلب، التشفير، كشف الاختلاف |
الخصائص التي تجعل XOR مميزة
هذه الخصائص هي أساس معظم الحيل البرمجية، ويستحق حفظها:
a ^ 0 = a— أي رقم مع صفر يبقى كما هو.a ^ a = 0— أي رقم مع نفسه يُلغى ويصبح صفرًا.- تبادلية وتجميعية:
a ^ b = b ^ a، والترتيب لا يهم عند دمج عدة قيم. - قابلة للعكس: إذا كان
a ^ b = c، فإنc ^ b = a. هذه الخاصية بالذات هي جوهر التشفير بـ XOR.
أبرز استخدامات XOR عمليًا
1) تبديل قيمتين بدون متغير مؤقت
حيلة كلاسيكية تعتمد على قابلية العكس:
x = x ^ y;
y = x ^ y;
x = x ^ y;
بعد هذه الأسطر الثلاثة تتبادل قيمتا x وy دون الحاجة إلى متغير ثالث. (ملاحظة عملية: نادرًا ما تكون أسرع من الطريقة العادية على المعالجات الحديثة، فاستخدمها للفهم لا للأداء.)
2) إيجاد العنصر الفريد
لو كان لديك مصفوفة يتكرر فيها كل رقم مرّتين عدا واحدًا، فإن دمج كل العناصر بـ XOR يُلغي المتكررات (a ^ a = 0) ويترك العنصر الفريد وحده. حل بزمن O(n) وذاكرة ثابتة.
3) التشفير البسيط
لأن (نص ^ مفتاح) ^ مفتاح = نص، يمكن تشفير البيانات وفكّها بنفس العملية ونفس المفتاح. تحذير مهم: تشفير XOR بمفتاح متكرر قصير ضعيف جدًا ويسهل كسره، ولا يصلح لحماية بيانات حقيقية. يبقى XOR لبنة داخل خوارزميات تشفير قوية (مثل AES)، لكن لا تستخدمه وحده لأمان فعلي.
4) التلاعب بالبتات
قيمة ^ قناع تقلب البتات التي يكون فيها القناع 1 وتترك الباقي كما هو — مفيد لتبديل حالة أعلام معيّنة دون المساس ببقية البتات.
القوائم المرتبطة بـ XOR
من أذكى تطبيقات XOR في هياكل البيانات «القائمة المرتبطة بـ XOR». في القائمة المزدوجة التقليدية تخزّن كل عقدة مؤشرين: next وprev. أما هنا فتُخزَّن قيمة واحدة تساوي عنوان_السابق ^ عنوان_التالي، ما يوفّر مساحة مؤشر كامل لكل عقدة.
للتنقل تحتاج إلى عنوان العقدة السابقة، ثم تستعيد التالية عبر: التالي = المخزَّن ^ السابق. ورغم أناقتها، هي غير عملية غالبًا: تكسر تصحيح الأخطاء، ولا تتوافق مع جامعات القمامة (garbage collectors) التي تتتبّع المؤشرات، وتصبح خطيرة إذا فسد مؤشر واحد. اعتبرها تمرينًا ذهنيًا رائعًا أكثر منها بنية للإنتاج.
نصيحة الخبير وخطأ شائع
أكثر خطأ يقع فيه المبتدئون هو الخلط بين معامل XOR ومعامل الأُس. في لغات مثل C وJava وJavaScript، الرمز ^ يعني XOR على البتات وليس «رفع للأس». فكتابة 2 ^ 3 لا تُعطي 8 بل تُعطي 1 (لأن 010 ^ 011 = 001). للأُس استخدم Math.pow أو **. تذكّر أن XOR يعمل بتًّا بتًّا على التمثيل الثنائي للأعداد.
الأسئلة الشائعة
ما الفرق بين XOR وOR؟ كلاهما يُعيد 1 عند وجود مدخل واحد بقيمة 1، لكن عند 1 و1 تُعيد OR القيمة 1 وتُعيد XOR القيمة 0. XOR تكشف «الاختلاف»، وOR تكشف «الوجود».
هل XOR مناسبة لتشفير كلمات المرور؟ لا. XOR وحده بمفتاح متكرر ضعيف جدًا. استخدم خوارزميات مخصّصة مثل bcrypt أو Argon2 لكلمات المرور، وAES للبيانات.
لماذا a ^ a تساوي صفرًا؟
لأن كل بت يُقارن بنفسه فيتطابق، وXOR تُعيد 0 عند التطابق، فتصبح كل البتات أصفارًا.
هل يمكن تطبيق XOR على أكثر من قيمتين؟ نعم. بفضل خاصية التجميعية يمكنك دمج سلسلة قيم بأي ترتيب، والنتيجة واحدة بغضّ النظر عن التسلسل.