المختصة بالبت Operators في C: AND، OR، XOR، Shift & إطراء
⚡ ملخص ذكي
تقوم عوامل التشغيل على مستوى البت في لغة C بمعالجة البيانات على مستوى البت الفردي، باستخدام عمليات AND و OR و XOR والمكملة وعمليات الإزاحة على المعاملات الصحيحة لإجراء حسابات أسرع وتعبئة العلامات والتحكم في الأجهزة في البرمجة منخفضة المستوى والمضمنة.

ما هي Bitwise؟ Operaتورس؟
المختصة بالبت Operaتُستخدم التورات لمعالجة البيانات على مستوى البت، ويُطلق عليها أيضًا برمجة مستوى البت. تعمل التورات على نمط بت واحد أو أكثر أو على أرقام ثنائية على مستوى بتاتها الفردية. وتُستخدم في العمليات الحسابية لتسريع عملية الحساب.
فيما يلي قائمة مشغلي البتات التي توفرها لغة البرمجة "C":
| المُشغل | معنى |
|---|---|
| & | عامل AND بتوي |
| | | عامل OR بتوي |
| ^ | عامل OR الحصري لكل بت |
| ~ | تكملة ثنائي واحد Operator هو عامل أحادي |
| << | عامل التحويل إلى اليسار |
| >> | مشغل التحويل إلى اليمين |
لا يمكن تطبيق عوامل التشغيل على مستوى البت مباشرةً على أنواع البيانات الأولية مثل الأعداد العشرية (float) والأعداد العشرية المزدوجة (double) وما إلى ذلك. تذكر دائمًا أن عوامل التشغيل على مستوى البت تُستخدم في الغالب مع نوع البيانات الصحيحة بسبب توافقه.
تعمل المشغلات المنطقية على البيانات بت بت، بدءًا من البت الأقل أهمية، أي بت LSB وهو البت الموجود في أقصى اليمين، وصولاً إلى البت الأكثر أهمية (MSB) وهو البت الموجود في أقصى اليسار.
تظهر نتيجة حساب المشغلات المنطقية لكل بت في الجدول أدناه.
| x | y | س وص | x | ذ | س ^ ص |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
أحادي المعامل AND
هذا هو أحد أكثر مشغلات البت المنطقية استخدامًا. يتم تمثيله بعلامة & واحدة (&). يتم كتابة تعبيرين صحيحين على كل جانب من مشغل (&).
تكون نتيجة عملية AND على مستوى البتات 1 إذا كان كلا البتاتين لهما القيمة 1؛ وإلا تكون النتيجة دائمًا 0.
لنفترض أن لدينا متغيرين op2 وop1 بقيمتين كما يلي:
Op1 = 0000 1101 Op2 = 0001 1001
ستكون نتيجة عملية AND على المتغيرين op1 وop2
Result = 0000 1001
كما نرى، تتم مقارنة متغيرين شيئا فشيئا. وعندما تكون قيمة البت في كلا المتغيرين 1، فإن النتيجة ستكون 1 وإلا 0.
أحادي المعامل OR
يتم تمثيله بعلامة خط عمودي واحدة (|). يتم كتابة تعبيرين صحيحين على كل جانب من عامل (|).
تكون نتيجة عملية OR ثنائية البت 1 إذا كان أحد التعبيرات على الأقل له القيمة 1؛ وإلا تكون النتيجة دائمًا 0.
لنفترض أن لدينا متغيرين op2 وop1 بقيمتين كما يلي:
Op1 = 0000 1101 Op2 = 0001 1001
ستكون نتيجة عملية OR على المتغيرين op1 وop2
Result = 0001 1101
كما نرى، تتم مقارنة متغيرين شيئا فشيئا. عندما تكون قيمة البت في أحد المتغيرات 1، فإن النتيجة ستكون 1 وإلا 0.
OR حصريًا على مستوى البت
يتم تمثيله بالرمز (^). يتم كتابة تعبيرين صحيحين على كل جانب من عامل (^).
تكون نتيجة عملية Exclusive-OR على مستوى البت 1 إذا كان أحد التعبيرات فقط له القيمة 1؛ وإلا تكون النتيجة دائمًا 0.
لنفترض أن لدينا متغيرين op2 وop1 بقيمتين كما يلي:
Op1 = 0000 1101 Op2 = 0001 1001
ستكون نتيجة عملية XOR على المتغيرين op1 وop2
Result = 0001 0100
كما نرى، تتم مقارنة متغيرين شيئا فشيئا. عندما يحمل متغير واحد فقط القيمة 1، تكون النتيجة 0 وإلا ستكون النتيجة 0.
دعونا نكتب برنامجًا بسيطًا يوضح العمليات المنطقية على مستوى البت.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int b = 21; /* 21 = 010101 */ int c = 0; c = a & b; /* 20 = 010100 */ printf("AND - Value of c is %d\n", c ); c = a | b; /* 21 = 010101 */ printf("OR - Value of c is %d\n", c ); c = a ^ b; /* 1 = 0001 */ printf("Exclusive-OR - Value of c is %d\n", c ); getch(); }
الإخراج:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
مشغلات التحويل على مستوى البت
تُستخدم عوامل الإزاحة الثنائية لتحريك أنماط البتات إما إلى اليسار أو اليمين. اليسار واليمين هما عاملان للإزاحة توفرهما لغة C، ويتم تمثيلهما كما يلي:
Operand << n (Left Shift) Operand >> n (Right Shift)
هنا،
- المتعامل هو عبارة عن تعبير عدد صحيح يتعين علينا إجراء عملية التحويل عليه.
- 'n' هو العدد الإجمالي لمواضع البتات التي يتعين علينا تحويلها في تعبير العدد الصحيح.
ستؤدي عملية التحويل إلى اليسار إلى تحويل عدد البتات n إلى الجانب الأيسر. سيتم إخراج البتات الموجودة في أقصى اليسار في التعبير، وسيتم ملء البتات n ذات القيمة 0 على الجانب الأيمن.
ستؤدي عملية التحويل إلى اليمين إلى تحويل عدد البتات n إلى الجانب الأيمن. سيتم إخراج البتات n الموجودة في أقصى اليمين في التعبير، وسيتم ملء القيمة 0 على الجانب الأيسر.
مثال: x عبارة عن تعبير عدد صحيح بالبيانات 1111. بعد إجراء عملية التحويل ستكون النتيجة:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
Shiftيمكن دمج عوامل التشغيل، ثم يمكن استخدامها لـtracلنقم بتحويل البيانات من التعبير العددي الصحيح. لنكتب برنامجًا لتوضيح استخدام عوامل الإزاحة الثنائية.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int c = 0; c = a << 2; /* 80 = 101000 */ printf("Left shift - Value of c is %d\n", c ); c = a >> 2; /*05 = 000101 */ printf("Right shift - Value of c is %d\n", c ); return 0; }
الإخراج:
Left shift - Value of c is 80 Right shift - Value of c is 5
بعد إجراء عملية التحويل إلى اليسار ستصبح القيمة 80 والمكافئ الثنائي لها هو 101000.
بعد إجراء عملية التحويل إلى اليمين، ستصبح القيمة 5، والمكافئ الثنائي لها هو 000101.
عامل المكمل الثنائي
يُطلق على المكمل الثنائي أيضًا اسم عامل المكمل الفردي لأنه يأخذ دائمًا قيمة واحدة أو متغيرًا واحدًا. وهو عامل أحادي.
عندما نقوم بإجراء تكملة على أي بت، تصبح جميع الآحاد 1 والعكس صحيح.
إذا كان لدينا تعبير عدد صحيح يحتوي على 0000 1111 ثم بعد إجراء عملية المكمل الثنائي ستصبح القيمة 1111 0000.
يتم الإشارة إلى عامل المكمل الثنائي بالرمز (~).
دعونا نكتب برنامجًا يوضح تنفيذ عامل المكمل الثنائي.
#include <stdio.h> int main() { int a = 10; /* 10 = 1010 */ int c = 0; c = ~(a); printf("Complement - Value of c is %d\n", c ); return 0; }
الإخراج:
Complement - Value of c is -11
إليكم برنامج آخر، مع مثال على جميع العوامل التي تمت مناقشتها حتى الآن:
#include <stdio.h> main() { unsigned int x = 48; /* 48 = 0011 0000 */ unsigned int y = 13; /* 13 = 0000 1101 */ int z = 0; z =x & y; /* 0 = 0000 0000 */ printf("Bitwise AND Operator - x & y = %d\n", z ); z = x | y; /* 61 = 0011 1101 */ printf("Bitwise OR Operator - x | y = %d\n", z ); z= x^y; /* 61 = 0011 1101 */ printf("Bitwise XOR Operator- x^y= %d\n", z); z = ~x; /*-49 = 11001111 */ printf("Bitwise One's Complement Operator - ~x = %d\n", z); z = x << 2; /* 192 = 1100 0000 */ printf("Bitwise Left Shift Operator x << 2= %d\n", z ); z= x >> 2; /* 12 = 0000 1100 */ printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}
بعد أن نقوم بتجميع البرنامج وتشغيله، فإنه ينتج النتيجة التالية:
Bitwise AND Operator - x & y = 0 Bitwise OR Operator - x | y = 61 Bitwise XOR Operator- x^y= 61 Bitwise One's Complement Operator - ~x = -49 Bitwise Left Shift Operator x << 2= 192 Bitwise Right Shift Operator x >> 2= 12
