Arduino/compound operators/compoundbitwisexor

من موسوعة حسوب
مراجعة 14:09، 11 أكتوبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (أنشأ الصفحة ب'يُستعمَل المعامل <code>=^</code> المركَّب عادةً مع متغير وثابت لقلب (عكس) قيمة بت محدَّد. اطلع على ا...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

يُستعمَل المعامل =^ المركَّب عادةً مع متغير وثابت لقلب (عكس) قيمة بت محدَّد.

اطلع على الشكل التالي الذي يشرح تطبيق المعامل ^ مع الأعداد الثنائية:

0  0  1  1    operand1
0  1  0  1    operand2
----------
0  1  1  0    result = operand1 ^ operand2

البنية العامة

x ^= y;   // x = x ^ y; يكافئ

المعاملات

x

متغيرٌ من النوع: محرف، أو عدد صحيح، أو عدد طويل.

y

متغيرٌ أو ثابتٌ من النوع: محرف، أو عدد صحيح، أو عدد طويل.

أمثلة

تبقى قيمة البتات التي تطبق العملية XOR -عبر المعامل ^- عليها مع أصفارٍ دون تغيير، لذا يكون المثال التالي محققًا دومًا لأي نوع من المتغيرات:

myByte ^ B00000000 = myByte;

أمَّا قيمة البتات التي تطبق العملية XOR -عبر المعامل ^- عليها مع واحدات فستُقلَب (toggled) قيمتها (إذا كانت 0 تصبح 1 والعكس صحيح):

myByte ^ B11111111 = ~myByte;

ملاحظات وتحذيرات

بما أنَّنا نتعامل مع بتات عند استعمال معاملات الأعداد الثنائية، فمن الملائم استعمال الصيغة الثنائية مع الثوابت التي نستخدمها. لا تتغير قيمة الأعداد عند تمثيلها بأنظمة عد مختلفة (مثل النظام الثنائي والعشري)، إلا أنها تصبح عصيَّة على الفهم بعض الشيء إن لم تُمثَّل بالنظام العشري المألوف لدى البشر. يُكتَب أحيانًا الصفر بالشكل B00000000 للتوضيح فقط مع أنَّ الصفرَ هو صفرٌ في أي نظام عدِّ كان.

بناءً على ما سبق، لقلب قيمة البت الأول والثاني فقط (عكس قيمتهما من 0 إلى 1 أو من 1 إلى 0) في متغير دون المساس بالبتات الأخرى، يمكن استعمال المعامل =^ المركب مع الثابت B00000011 الذي يدعى «قناعًا»:

1  0  1  0  1  0  1  0    المتغير
0  0  0  0  0  0  1  1     القناع
----------------------
1  0  1  0  1  0  0  1     الناتج
|              |  |  |
 --------------    --
    عُكسَت      لم تتغير

يمكن إعادة تمثيل الشكل السابق مع تبديل الرمز x مكان بتات المتغير لمعرفة البتات التي قُلبَت (ستُمثَّل بالرمز x~) من تلك التي لم تتغير بعد تنفيذ العملية:

x  x  x  x  x  x  x  x    المتغير
0  0  0  0  0  0  1  1     القناع
----------------------
x  x  x  x  x  x ~x ~x     الناتج
|              |  |  |
 --------------    --
    عُكسَت      لم تتغير

الآن، يجب أن يبدو المثال التالي واضحًا ومفهومًا وأن تعرف كيفية استعمال المعامل =^ لقلب البتات التي تريدها:

myByte =  B10101010;
myByte ^= B00000011 == B10101001;

انظر أيضًا

مصادر