عوامل العمليات بين البتات المفردةBit –Bit Operators أو bitwise operators
تستخدم عوامل البتات المفردة فى "تعديل بتات المعاملات العددية بشكل فردى أى كل بت على حدة " .
عوامل البتات المفردة مرتبطة من اليسار لليمين . الاستثناء الوحيد هو عامل البت المفردة الخاص بالنفى أو المكمل complement operator ~ حيث يرتبط من اليمين لليسار .
عوامل البت المفردة &, | , ^ تقوم بتنفيذ العمليات المنطقية على زوج البتات المتناظر فى كل من معاملاتها . العامل ~ يكمل أو يتمم complements كل بت بمعامله فإن كانت البت بواحد يحولها إلى الصفر وأن كانت بصفر يحولها إلى الواحد .
مثال :
كود:
0x1234 & 0x5678 /* equals 0x1230 */
/* because ..
0x1234 : 0001 0010 0011 0100
0x5678 : 0101 0110 0111 1000
----------------------------
& : 0001 0010 0011 0000
.. that is, 0x1230 */
/* Similarly: */
0x1234 | 0x5678; /* equals 0x567C */
0x1234 ^ 0x5678; /* equals 0x444C */
~ 0x1234; /* equals 0xEDCB */
ملحوظة : يمكن أن يستخدم العامل & كمؤشر pointer.
تستخدم عوامل العمليات بين البتات المفردة فى تنفيذ "العمليات المنطقية" بين عناصر أو متغيرات .
أ- العامل " و" AND :
يتم تنفيذ العملية المنطقية AND على كل بت على حدة من المعاملات operands (الموجودة كطرفين للعامل) .
نستخدم هذا العامل بكثرة فى عملية إخفاء AND "mask" البايت , من أجل تمكين enable أو عدم تمكين disable " البتات التى نريدها فقط " كما فى المثال التالى :
كود:
int, b;
a = 100;
b = 28;
a = a & b;
تتم عملية AND كما يلى :
كود:
a = 100 ----> 01100100
AND (&)
b = 28 ----> 00011100
___________________
Result = 00000100 // or 4 decimal – only one bit – mask others
ب- العامل أو OR Operator (|) :
العامل OR سهل للغاية بالمقارنة بالعامل AND , أيضا عمله ينفذ على كل بت على حدة من بتات المعاملات كما فى المثال التالى :
كود:
int, b;
a = 100;
b = 28;
a = a | b;
تتم عملية OR كما يلى :
كود:
a = 100 ----> 01100100
OR (|)
b = 28 ----> 00011100
___________________
Result = 01111100 // or 124 decimal
ت- عامل "أو المنفردة أو الحصرية" XOR operator (^) :
يستخدم العامل XOR على نطاق واسع فى المقارنة بين القيم , لأن فى عملياته المنطقية , سوف تكون النتيجة صواب true (logic 1) فقط "إذا كان أحد وفقط أحد طرفى المقارنة صواب true " كما فى المثال التالى :
كود:
int, b;
a = 100;
b = 28;
a = a ^ b;
تتم عملية XOR كما يلى :
كود:
a = 100 ----> 01100100
XOR (^)
b = 28 ----> 00011100
___________________
Result = 01111000 // or 120 decimal
ث- عامل النفى أو المعكوس NOT operator (~) :
يقوم عامل النفى NOT " بعكس حالة كل بت من المعامل الذى يليه كما فى المثال التالى :
كود:
int a, b, c;
a = 1;
b = 1;
b = ~ a
~ c = b
يتم تنفيذ عملية النفى كما يلى
كود:
a = 0B00000001; NOT "a" ----> 0b11111110;
b = 0b00000001; NOT "b" ----> 0b11111110;
ج- عوامل الإزاحة جهة اليمين وجهة اليسار shift operator << >> :
عوامل الإزاحة << , >> ثنائية المعاملات و"تحرك move بتات "المعامل الأيسر" بعدد من المواضع المحددة "بالمعامل الأيمن" جهة اليسار أو جهة اليمين على الترتيب . المعامل الأيمن يجب أن يكون موجبا .
عند استخدام عامل الإزاحة جهة اليسار (<<) , فإن "أبعد بتات جهة اليسار سوف يتم التخلص منها والبتات الجديدة (التى أصبحت خالية) جهة اليمين يخصص لها أصفار " . نتيجة لذلك فإن "إزاحة معامل جهة اليسار بعدد n موقع" يكافىء "ضرب هذا المعامل فى 2n إذا كانت جميع البتات التى تم التخلص منها بأصفار .
عند استخدام عامل الإزاحة جهة اليمين (>>) , فإن "أبعد بتات جهة اليمين سوف يتم التخلص منها والبتات التى أصبحت خالية جهة اليسار يخصص لها أصفار " . نتيجة لذلك فإن "إزاحة معامل جهة اليمين بعدد n موقع" يكافىء "قسمة هذا المعامل فى 2n إذا كانت جميع البتات التى تم التخلص منها بأصفار .
مثال :
كود:
int a, b, c;
a = 10;
b = 10;
b = a >> 2;
c =b<< 5;
فى هذا المثال تم إزاحة قيم بتات المتغير "a" لموقعين جهة اليمين بينما تم إزاحة بتات المتغير " b " لخمس مواقع جهة اليسار .
تتم عملية الإزاحة كما يلى :
كود:
variable // ----> 00001010 - value 10 in binary
>>
// ----> 00000101 - value 5 in binary
مقارنة بين عوامل البتات المفردة والعوامل المنطقية Bitwise vs. Logical :
يجب أن تكون على علم تام بالأختلاف الأساسى بين عمل كل من عوامل البتات المفردة والعوامل المنطقية .
مثال :
كود:
0222222 & 0555555; /* equals 000000 -bitwise AND >>> 5=101 & 2 =010 =0*/
0222222 && 0555555; /* equals 1- Logical AND && returns 1 only if both expressions evaluate to be nonzero*/
~ 0x1234; /* equals 0xEDCB >>> 0xE=~0x1,0xD=~0x2 … bitwise complement (unary); inverts each bit */
! 0x1234; /* equals 0 >>> logical negation, negation of non-zero is zero-Logical operators always return 1 or 0 */