المعامل << في أردوينو

من موسوعة حسوب
< Arduino‏ | bitwise operators
مراجعة 07:10، 11 أكتوبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

يزيح المعامل << البتات الواقعة على يساره إلى اليمين عددًا محدَّدًا من الخانات مساويًا للقيمة الموجودة على يمينه.

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

variable >> number_of_bits;

المعاملات

variable

القيمة العددية الثنائية المراد إزاحة البتات فيها عددًا محدَّدًا من الخانات. أنواع البيانات المسموح بها هي: بايت، وعدد صحيح، وعدد طويل.

number_of_bits

عددٌ صحيحٌ يمثِّل مقدار الإزاحة التي ستُطبَّق على العدد variable. يجب أن تكون قيمة هذا المعامل <= 32.

أمثلة

مثالٌ على استعمال المعامل <<:

int a = 40;       // 0000000000101000 :القيمة الثنائية هي
int b = a >> 3;   // القيمة الثنائية الناتجة: 0000000000000101، وتساوي 5 في النظام العشري

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

عند إزاحة قيمةٍ ما ولتكن x فرضًا بمقدارٍ محدَّدٍ وليكن y (أي x >> y) وكانت قيمة أعلى بت (البت الأكثر أهمية) فيه 1، فسيعتمد سلوك عملية الإزاحة على نوع القيمة x. فإن كان x عددًا صحيحًا، فسيُمثِّل أعلى بت فيه (الواقع في أقصى اليسار) بت الإشارة مُحدِّدًا إن كان العدد x سالبًا أو موجبًا. في هذه الحالة، سيُنسَخ بت الإشارة أثناء إزاحته إلى اليمين ولن يحل مكانه أصفارٌ؛ هذا السلوك عائدٍ إلى أسباب تاريخية خفية:

int x = -16;     // 1111111111110000 :القيمة الثنائية
int y = 3;
int result = x >> y;  // 1111111111111110 :القيمة الثنائية الناتجة

قد لا يكون هذا السلوك، الذي يدعى «تمديد الإشارة» (sign extension)، هو السلوك الاعتيادي الذي تريده. عوضًا عن ذلك، قد ترغب بأن تدخل أصفارٌ مكان البتات المزاحة من اليسار. يتضح أنَّ قواعد الإزاحة نحو اليمين تختلف مع تعابير الأعداد الصحيحة عديمة الإشارة (unsigned int)، لذا يمكنك استعمال التحويل المباشر باستعمال القوسين كما موضح في المثال التالي لمنع نسخ الواحدات من أقصى اليسار بتنفيذ سلوك تمديد الإشارة:

int x = -16;                   // 1111111111110000 :القيمة الثنائية هي
int y = 3;
int result = (unsigned int)x >> y;  // القيمة الثنائية الناتجة: 0001111111111110

إن كنت شديد الحرص على تجنب سلوك «تمديد الإشارة»، فيمكنك استعمال المعامل << كوسيلةٍ للقسمة على العدد 2n، إذ n هو مقدار الإزاحة. انظر مثلًا إلى الشيفرة التالية:

int x = 1000;
int y = x >> 3;   // سيُعطي الناتج الصحيح لقسمة 1000 على 8 وهو 125

انظر أيضًا

  • المعامل &: يُجرِي في لغة ++C العملية AND على كل بتين متقابلين من بتات العددين المعطيين بشكل مستقل ويعطي القيمة العددية الناتجة.
  • المعامل >>: يُجرِي البتات الواقعة على يساره إلى اليسار عددًا محدَّدًا من الخانات مساويًا للقيمة الموجودة على يمينه.
  • المعامل ^: يُجرِي في لغة ++C العملية XOR على كل بتين متقابلين من بتات العددين المعطيين بشكل مستقل ويعطي القيمة العددية الناتجة.
  • المعامل |: يُجرِي في لغة ++C العملية OR على كل بتين متقابلين من بتات العددين المعطيين بشكل مستقل ويعطي القيمة العددية الناتجة.
  • المعامل ~: يُجرِي في لغة ++C العملية NOT على كل بت من البتات المعطاة بشكل مستقل -بخلاف المعامل & والمعامل |- ويعطي القيمة العددية الناتجة.
  • درسٌ عمليٌّ على العمليات الحسابية التي تجرَى على البت.

مصادر