التحول المنطقي

في علم الحاسوب ، الإزاحة المنطقية هي عملية على مستوى البتات تُزيح جميع بتات المعامل. النوعان الأساسيان هما الإزاحة المنطقية لليسار والإزاحة المنطقية لليمين . ويُعدَّل هذا النوع بعدد خانات البتات التي تُزاح بها القيمة، مثل الإزاحة لليسار بمقدار 1 أو الإزاحة لليمين بمقدار n . على عكس الإزاحة الحسابية ، لا تحافظ الإزاحة المنطقية على بت الإشارة للعدد ولا تُميِّز بين أس العدد وجزئه الكسري (المانتسا)؛ إذ يُزاح كل بت في المعامل عددًا محددًا من خانات البتات، وتُملأ خانات البتات الفارغة، عادةً بالأصفار، وربما بالآحاد (على عكس الإزاحة الدائرية ).

يُستخدم التحويل المنطقي غالبًا عندما يتم التعامل مع المعامل الخاص به كسلسلة من البتات بدلاً من كونه رقمًا.

عوامل الإزاحة المنطقية في لغات البرمجة والمعالجات المختلفة
اللغة أو المعالجغادريمين
آدا [ 1 ]Shift_LeftShift_يمين
Batch ، [ 2 ] C ، C++ ، Go ، Swift (الأنواع غير الموقعة فقط)؛ Standard ML ، Verilog ، PHP ، Python ، [ 3 ] Rust [ 4 ] (الأنواع غير الموقعة فقط [ 5 ] )<<>>
D ، جافا ، جافا سكريبت ، جوليا<<>>>
F# (الأنواع غير الموقعة فقط)<<<>>>
فورترانLSHIFTRSHIFT
أوكاميلlsllsr
أوبجكت باسكال ، دلفي ، لغة التجميع x86 ، كوتلين ، باور شيلشلشر
VHDL ، MIPS ، RISC-Vsllشركة ذات مسؤولية محدودة
باور بي سيslwsrw

تُعدّ عمليات الإزاحة المنطقية مفيدة كطرق فعّالة لإجراء عمليات الضرب أو القسمة للأعداد الصحيحة غير الموقّعة على قوى العدد اثنين. إزاحة عدد ثنائي موقّع أو غير موقّع بمقدار n بت إلى اليسار تُؤدي إلى ضربه في 2^ n . أما إزاحة عدد ثنائي غير موقّع بمقدار n بت إلى اليمين فتُؤدي إلى قسمته على 2^ n (مع تقريب الناتج إلى الصفر).

يختلف الإزاحة المنطقية إلى اليمين عن الإزاحة الحسابية إلى اليمين. ولذلك، تستخدم العديد من اللغات مُعاملات مختلفة لكل منهما. على سبيل المثال، في لغتي جافا وجافا سكريبت ، مُعامل الإزاحة المنطقية إلى اليمين هو >>> ، بينما مُعامل الإزاحة الحسابية إلى اليمين هو >> . (تحتوي جافا على مُعامل إزاحة واحد فقط إلى اليسار ( << )، لأن الإزاحة إلى اليسار منطقيًا وحسابيًا لها نفس التأثير).

مع ذلك، تحتوي لغات البرمجة C و C++ و Go على مُعامل إزاحة واحد فقط لليمين، وهو >> . تختار معظم تطبيقات C و C++، بالإضافة إلى Go، نوع الإزاحة المناسبة بناءً على نوع العدد الصحيح المُراد إزاحته: تُزاح الأعداد الصحيحة المُوقّعة باستخدام الإزاحة الحسابية، بينما تُزاح الأعداد الصحيحة غير المُوقّعة باستخدام الإزاحة المنطقية. على وجه الخصوص، تستخدم C++ مُعاملات الإزاحة المنطقية كجزء من بنية دوال الإدخال والإخراج، والتي تُسمى "cin" و "cout" على التوالي.

تترك جميع معايير لغة C ذات الصلة حاليًا (ISO/IEC 9899:1999 إلى 2011) ثغرة تعريفية للحالات التي يكون فيها عدد عمليات الإزاحة مساويًا أو أكبر من عدد البتات في المعاملات، بحيث تكون النتيجة غير محددة. يُتيح هذا لمترجمات لغة C إنتاج شيفرة فعّالة لمنصات مختلفة، وذلك بالسماح بالاستخدام المباشر لتعليمات الإزاحة الأصلية التي تختلف في سلوكها. على سبيل المثال، في معالجات PowerPC ، يختار الأمر shift-left-word السلوك الأكثر بديهية، حيث تُعطي الإزاحة بمقدار عرض البت أو أكثر قيمة صفرية، [ 6 ] بينما في معالجات x86، يختار الأمر SHL إخفاء مقدار الإزاحة في البتات الأدنى لتقليل الحد الأقصى لوقت تنفيذ التعليمات ، وبالتالي لا تُغير الإزاحة بمقدار عرض البت القيمة. [ 7 ]

تترك بعض اللغات، مثل .NET Framework و LLVM ، عملية الإزاحة بمقدار عرض البت وما فوقها غير محددة (في .NET) [ 8 ] أو غير مُعرَّفة (في LLVM). [ 9 ] بينما تختار لغات أخرى تحديد سلوك منصاتها المستهدفة الأكثر شيوعًا، مثل C# التي تحدد سلوك x86. [ 10 ]

مثال

إذا تم إزاحة تسلسل البتات 0001 0111 (العدد العشري 23) منطقياً بمقدار خانة بت واحدة، فإن:

يؤدي التحويل إلى اليسار إلى: 0010 1110 (العدد العشري 46)
إزاحة منطقية لليسار بمقدار بت واحد
يؤدي الإزاحة إلى اليمين إلى: 0000 1011 (العشري 11)
إزاحة منطقية لليمين بمقدار بت واحد

ملاحظة: MSB = البت الأكثر أهمية، LSB = البت الأقل أهمية

مراجع

  1. "واجهات الحزم" . www.adaic.org .
  2. "تعيين - متغير البيئة - موجه أوامر ويندوز - SS64.com" . ss64.com .
  3. "BitwiseOperators - Python Wiki" . wiki.python.org . تم الاطلاع عليه بتاريخ 24 يناير 2018 .
  4. "Shl in std::ops - Rust" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 17 يناير 2022 .
  5. "تعبيرات المعاملات: المعاملات الثنائية الحسابية والمنطقية" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 13-11-2022 .
  6. "مجموعة تعليمات PowerPC: slw" . pds.twi.tudelft.nl . مؤرشف من الأصل في 4 سبتمبر 2014. تم الاطلاع عليه في 9 أبريل 2016 .
  7. "مرجع مجموعة تعليمات x86" . x86.renejeschke.de . مؤرشف من الأصل بتاريخ 19 فبراير 2018. تم الاطلاع عليه بتاريخ 9 أبريل 2016 .
  8. "Opcodes.Shl Field" . msdn.microsoft.com . مايكروسوفت . تم الاطلاع عليه بتاريخ 9 أبريل 2016 .
  9. "دليل مرجعي للغة LLVM - تعليمات shl" . llvm.org . مشروع LLVM . تم الاطلاع عليه بتاريخ 9 أبريل 2016 .
  10. "عامل التشغيل << (مرجع C#)" . msdn.microsoft.com . مايكروسوفت . تم الاطلاع عليه في 9 أبريل 2016 .