المختصة بالبت Operators في C: AND، OR، XOR، Shift & إطراء

⚡ ملخص ذكي

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

  • 🧮 Operaتورس: ستة عوامل تشغيلية - AND (&)، OR (|)، XOR (^)، المكمل (~)، الإزاحة إلى اليسار (<<)، الإزاحة إلى اليمين (>>) - تعمل بتًا بتًا.
  • 🔗 و أو: تكون نتيجة & هي 1 فقط عندما تكون كلتا البتتين 1؛ وتكون نتيجة | هي 1 عندما تكون أي من البتتين 1.
  • 🔀 XOR: تكون النتيجة ^ هي 1 عندما تكون بتة واحدة فقط تساوي 1، وهو أمر مفيد لتبديل البتات وعمليات التبديل.ping القيم.
  • ↔️ Shifts: يقوم العاملان << و >> بتحريك البتات إلى اليسار أو اليمين، والضرب أو القسمة على قوى العدد اثنين.
  • 🔁 تكملة: يقوم عامل التشغيل ~ بقلب كل بت، لذا يصبح 0000 1111 هو 1111 0000.
  • 🤖 مساعدة الذكاء الاصطناعي: يقوم المساعدون المدعومون بالذكاء الاصطناعي وبرنامج GitHub Copilot بإنشاء وشرح منطق قناع البت والإزاحة بسرعة.

المختصة بالبت Operaتورس في سي

ما هي 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

الأسئلة الشائعة

تعمل عملية AND المنطقية (&) على البتات الفردية وتعيد عددًا صحيحًا، بينما تختبر عملية AND المنطقية (&&) التعبيرات الكاملة وتعيد قيمة منطقية واحدة صحيحة أو خاطئة.

Shift 1 لإنشاء قناع: قم بتعيينه بالقيمة | (1 << n)، وقم بمسحه بالقيمة & ~ (1 << n)، وقم بالتبديل بالقيمة ^ ​​(1 << n).

يؤدي الإزاحة إلى اليسار بمقدار n إلى ضرب قيمة غير موقعة في 2 مرفوعة إلى n؛ أما الإزاحة إلى اليمين فتقسم عليها، لذلك تستخدم المترجمات عمليات الإزاحة من أجل السرعة.

تحقق من الرقم و 1. تُرجع البتة الأدنى 1 للقيم الفردية و 0 للقيم الزوجية، وهو أسرع من عامل باقي القسمة.

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

Shift ترتبط المعاملات بشكل أقوى من المعاملات العلائقية، بينما تقع & و ^ و | أسفل المساواة ولكن فوق && و || المنطقية، لذا ضع الأقواس لتكون آمنًا.

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

مساعد الطيار جيثب يقترح وحدات ماكرو قناع البت، ومساعدات تعيين ومسح البت، وعمليات التحويل الحسابي من تعليق؛ راجع عمليات الإكمال الخاصة به مقابل تخطيط البت الخاص بك.

تلخيص هذه التدوينة بـ: