 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:
|
|
23-05-2017, 10:20 PM
المشاركة 18
|
|
العوامل المختصة بالبتات Bitwise Operators :
بالإضافة إلى العوامل الرياضية والمنطقية ، فإن العوامل المختصة بالبتات تستخدم فى تعديل بتات المتغير ، كل بت على حدة . الجدول أدناه يبين العوامل المختصة بالبتات فى الميكروسى برو .
هذه العوامل يمكن أن تستخدم فقط مغ المتغيرات من نوع العدد الصحيح .

العامل “&” يقوم بإجراء عملية AND على البتات (كل على حدة) الخاصة بعامليه . كل بت للمعامل الأول يتم عمل AND لها مع البت المناظرة للمعامل الثانى . البت الناتجة تكون واحد “1” فقط إذا كانت كل من البتين المناظرين بواحد “1” ، وإلا كانت النتيجة بصفر “0” ، كما فى المثال التالى :
كود:
int x, y, z;
x = 0xF0E0; //x = “1111 0000 1110 0000”
y = 0x0F71; //y = “0000 1111 0111 0001”
z = x & y; //z = “0000 0000 0110 0000” i.e. 0x0060
العامل “|” يقوم بإجراء عملية OR على بتات معاملية (كل بت على حدة ) . كل بت من المعامل الأول يتم عمل OR لها مع البت المناظرى للمعامل الثانى . البت الناتجة تكون بواحد “1” إذا كان أى من البتات المناظرة بواحد “1” ، وإلا فإن البت الناتجة تكون بصفر ، كما فى المثال التالى :
كود:
int x, y, z;
x = 0xF0E0; //x = “1111 0000 1110 0000”
y = 0x0F71; //y = “0000 1111 0111 0001”
z = x j y; //z = “1111 1111 1111 0001” i.e. 0xFFF1
العامل “^” يقوم بإجراء عملية XOR على بتات معامليه (كل بت على حدة ) ، كل بت من المعامل الأول يتم عمل XOR لها مع البت المناظرة للمعامل الثانى . البت الناتجة تكون بواحد “1” إذا كان أحد البتين فقط بواحد “1” ، وإلا فإن البت الناتجة تكون بصفر ، كما فى المثال التالى :
كود:
int x, y, z;
x = 0xF0E0; //x = “1111 0000 1110 0000”
y = 0x0F71; //y = “0000 1111 0111 0001”
z = x ^ y; //z = “1111 1111 1001 0001” i.e. 0xFF91
العامل “~” يقوم بإجراء عملية "تكملة" complement لبتات معامله (أحادى المعامل) . كل بت على حدة يتم "تكملتها" أى الصفر “0” يصبح واحد “1” والواحد “1” يصبح صفر “0” ، كما فى المثال التالى :
كود:
int x, y;
x = 0xF0E0; //x = “1111 0000 1110 0000”
y = ~x ; //y = “0000 1111 0001 1111” i.e. 0x0F1F
العامل “<<” يقوم بإجراء عملية "إزاحة" shift جهة "اليسار" . يتم عمل إزاحة لمعامله (أحادى المعامل) لجهة اليسار بعدد “n” من البتات ، حيث “n” يتم تحديدها بمعرفة المبرمج . يتم ملو بتات الجانب الأيمن للمتغير أى البتات ذات القيمة الأدنى LSB بأصفار ، فى حين يتم فقد البتات الموجودة على الجانب الأيسر للمتغير أى البتات ذات القيمة الأقصى MSB .
إزاحة المتغير إلى جهة اليسار بواحد بت هو نفسه مثل الضرب فى “2” ، وإزاحة المتغير إلى جهة اليسار “2” بت هو نفسه مثل الضرب فى “4” وهكذا ، لكن عملية الإزاحة تكون أسرع بكثير كما فى المثال التالى :
كود:
int x, y;
x = 3;
y = x << 2; //y = 12
الشكل التالى يبين العملية الفعلية للإزاحة جهة اليسار ، المبينة فى المثال السابق :

العامل “>>” يقوم بعملية إزاحة جهة اليمين . يتم عمل إزاحة لجهة اليمين لبتات معامله (أحادى المعامل) “n” من البتات ، حيث “n” يتم تحديدها بمعرفة المبرمج . بتات الجانب الأيسر للمتغير أى البتات ذات القيمة القصوى MSB يتم ملوها بأصفار ، فى حين أن بتات الجانب الأيمن للمتغير أى البتات ذات القيمة الأدنى LSB يتم فقدها .
إزاحة المتغير لجهة اليمين بواحد بت هو نفسه قسمة المتغير على “2” ، وإزاحة المتغير “2” بت هو نفسه قسمة المتغير على “4” وهكذا ، لكن عامل الزحزحة يكون أسرع بكثير، كما فى المثال التالى :
int x, y;
x = 12;
y = x >> 2; //y = 3
الشكل التالى يبين العملية الفعلية للإزاحة جهة اليمين ، المبينة فى المثال السابق :

|