انتقل إلى المحتوى

عملية على مستوى البتات

هذه المقالة يتيمة. ساعد بإضافة وصلة إليها في مقالة متعلقة بها
من ويكيبيديا، الموسوعة الحرة

عملية على مستوى البتات Bitwise operation- في البرمجيات، تعمل عملية بتية على سلسلة بتات، أو مصفوفة بتات، أو رقم ثنائي (والذي يعد سلسلة بتات) على مستوى بتاته الفردية. إنه إجراء سريع وبسيط، أساسي للعمليات الحسابية ذات المستوى الأعلى، ويدعمه المعالج بشكل مباشر. يتم تقديم معظم العمليات التي تتم على أساس البتات على هيئة تعليمات ذات متغيرين حيث تحل النتيجة محل أحد متغيرات الإدخال.

في المعالجات البسيطة منخفضة التكلفة، تكون العمليات التي تتم على أساس البت أسرع بشكل كبير من عملية القسمة، وأسرع بعدة مرات من عملية الضرب، وأحيانًا أسرع بشكل كبير من عملية الجمع. وفي المقابل نجد أن المعالجات الحديثة عادةً ما تقوم بعمليات الجمع والضرب بنفس سرعة العمليات ثنائية البت نظرًا لخطوط التعليمات الأطول والخيارات الأخرى في تصميم معمارية الحاسوب، فإن العمليات ثنائية البت تستخدم عادةً طاقة أقل بسبب الاستخدام المنخفض للموارد. [1]

مشغلات البت

[عدل]

في التفسيرات الموضحة بأسفل، يتم حساب أي إشارة إلى موضع البت من ناحية اليمين (الأقل أهمية)، ثم يتم التقدم إلى ناحية اليسار. فعلى سبيل المثال، القيمة الثنائية 0001 (العدد العشري 1) تحتوي على أصفار في كل موضع باستثناء الموضع الأول (أي أقصى اليمين).

العملية (لا)

[عدل]

إن عملية "لا" على مستوى البت، أو المكمل على مستوى البت، هي عملية أحادية تقوم بإجراء نفي منطقي على كل بت، مما يشكل المكمل الواحد للقيمة الثنائية المعطاة. البتات التي تساوي 0 تصبح 1، وتلك التي تساوي 1 تصبح 0. والمثال على ذلك يكمن في:

NOT 0111 (العدد العشري 7)

= 1000 (العدد العشري 8)

NOT 10101011 (العدد العشري 171)

= 01010100 (العدد العشري 84)

النتيجة تساوي المتمم الثنائي للقيمة ناقص واحد. إذا تم استخدام حساب المكمل الثنائي،

إذن NOT x = -x − 1

وبالنسبة للأعداد الصحيحة غير المشار إليها، فإن المكمل الثنائي للرقم هو "الانعكاس المرآوي" للرقم عبر نقطة المنتصف لنطاق العدد الصحيح غير المشار إليه. على سبيل المثال، بالنسبة للأعداد الصحيحة غير المشار إليها المكونة من 8 بتات فإن، NOT x = 255 - x ، والتي يمكن تصورها على الرسم البياني كخط متجه لأسفل "يقلب" فعليًا نطاقًا متزايدًا من 0 إلى 255، إلى نطاق متناقص من 255 إلى 0. مثال بسيط ولكنه توضيحي للاستخدام هو عكس صورة بدرجات الرمادي حيث يتم تخزين كل بكسل كعدد صحيح غير مشار إليه.

العملية (و)

[عدل]
AND بتية للأعداد الصحيحة المكونة من 4 بت

عملية (و) هي عملية ثنائية تأخذ تمثيلين ثنائيين متساويين في الطول وتنفذ عملية "و" المنطقية على كل زوج من البتات المقابلة. وبالتالي، إذا كان كلا البتين في الموضع المقارن 1، فإن البت في التمثيل الثنائي الناتج يكون 1 (1× 1= 1)؛ وإلا فإن النتيجة هي 0 (1× 0= 0 و 0× 0= 0). والمثال على ذلك:

0101 (العدد العشري 5)

AND 0011 (العدد العشري 3)

= 0001 (العدد العشري 1)

ويمكن استخدام مثل هذه العملية بغرض تحديد ما إذا كان بت معين مضبوطًا (1) أو تم مسحه (0). على سبيل المثال، بالنظر إلى نمط البت 0011 (3 عشري)، لتحديد ما إذا كان البت الثاني مضبوطًا، نستخدم "و" بتيًا مع نمط بت يحتوي على 1 فقط في البت الثاني:

0011 (العدد العشري 3)

AND 0010 (العدد العشري 2)

= 0010 (العدد العشري 2)

ونظرًا لأن النتيجة 0010 ليست صفرًا، فإننا نعلم أن البت الثاني في النمط الأصلي تم تعيينه. ويُطلق على هذا في العادةً اسم إخفاء البتات. (على سبيل القياس، فإن استخدام شريط التغطية يغطي، أو يقنع، الأجزاء التي لا ينبغي تغييرها أو الأجزاء التي لا تهم. في حالتنا هذه، تخفي القيم 0 البتات التي لا تهم.)

ويمكن استخدام العملية "و" على مستوى البت بهدف مسح بتات محددة (أو علامات) من سجل يمثل فيه كل بت حالة منطقية فردية. تعتبر هذه التقنية طريقة فعالة لتخزين عدد من القيم المنطقية باستخدام أقل قدر ممكن من الذاكرة.

وعلى سبيل المثال، يمكن اعتبار 0110 (العدد العشري 6) مجموعة من أربعة أعلام مرقمة من ناحية اليمين إلى ناحية اليسار، حيث يكون كل من العلمين الأول والرابع فارغين (0)، ويتم تعيين العلمين الثاني والثالث (1). يمكن مسح العلم الثالث باستخدام "و" بتًا واحدًا مع النمط الذي يحتوي على صفر فقط في البت الثالث:

0110 (العدد العشري 6)

AND 1011 (العدد العشري 11)

= 0010 (العدد العشري 2)

وبناء على هذه الخاصية، يصبح من السهل التحقق من تكافؤ الرقم الثنائي عن طريق التحقق من قيمة البت الأقل قيمة. باستخدام المثال المقدم أعلاه:

0110 (العدد العشري 6)

AND 0001 (العدد العشري 1)

= 0000 (العدد العشري 0)

ولأن 6 و 1 يساوي صفرًا، فإن العدد 6 قابل للقسمة على اثنين، وبالتالي فهو زوجي.

العملية (أو)

[عدل]
OR بتية للأعداد الصحيحة المكونة من 4 بت

عملية (أو) هي عملية ثنائية تأخذ نمطين من البتات متساويين في الطول وتنفذ عملية (أو) الشاملة المنطقية على كل زوج من البتات المقابلة. النتيجة في كل موضع هي 0 إذا كان كلا البتات 0، وإلا فإن النتيجة هي 1. والمثال على ذلك يكمن في:

0101 (العدد العشري 5)

OR 0011 (العدد العشري 3)

= 0111 (العدد العشري 7)

ويمكن استخدام العملية (أو) على مستوى البت لتعيين البتات المحددة في السجل الموضح أعلاه إلى 1. فعلى سبيل المثال، من الممكن ضبط البت الرابع من 0010 (العدد العشري 2) عن طريق إجراء عملية (أو) على مستوى البت باستخدام النمط الذي يحتوي فقط على البت الرابع المضبوط:

0010 (العدد العشري 2)

OR 1000 (العدد العشري 8)

= 1010 (العدد العشري 10)

عملية (XOR)

[عدل]
XOR بتّي للأعداد الصحيحة المكونة من 4 بت

عملية (XOR) البتية هي عملية ثنائية تأخذ نمطين بتات متساويين في الطول، وتنفذ عملية (أو) الحصرية المنطقية على كل زوج من البتات المقابلة. النتيجة في كل موضع هي 1 إذا كان أحد البتات فقط هو 1، ولكنها ستكون 0 إذا كان كلاهما 0 أو كلاهما 1. في هذا نقوم بمقارنة بين بتين، حيث تكون القيمة 1 إذا كانت البتتين مختلفتين، وتكون القيمة 0 إذا كانتا متماثلتين. والمثال على ذلك يكمن في الآتي:

0101 (العدد العشري 5)

0011 (3 عشري) (XOR)

= 0 11 0 (العدد العشري 6)

يمكن استخدام العملية (XOR) ثنائية البت لعكس البتات المحددة في السجل (ويسمى أيضًا التبديل أو الانعكاس). يمكن تبديل أي بت عن طريق إجراء عملية (XOR) عليه مع 1. فعلى سبيل المثال، بالنظر إلى نمط البت 0010 (2 عشري)، يمكن تبديل البتات الثانية والرابعة بواسطة العملية (XOR) بتّي مع نمط بت يحتوي على 1 في الموضعين الثاني والرابع:

0 1 00 (العدد العشري 2)

01 0 1 (العدد العشري 10) (XOR)

= 0001 (العدد العشري 8)

ويمكن استخدام مثل هذه التقنية للتلاعب بأنماط البت التي تمثل مجموعات من الحالات المنطقية.

وفي بعض الأحيان يستخدم مبرمجو لغة التجميع ومُجمِّعي التحسين العملية "XOR" بوصفها اختصارًا لتعيين قيمة السجل إلى الصفر. حيث يؤدي إجراء XOR على قيمة ضد نفسها دائمًا، إلى الحصول على الصفر، وفي العديد من المعماريات تتطلب هذه العملية دورات ساعة أقل وذاكرة أقل من تحميل قيمة صفر وحفظها في السجل.

إذااُعتبرت مجموعة سلاسل البتات ذات الطول الثابت n (أي الكلمات الآلية) بمثابة فضاء متجهي ذو أبعاد n فوق الحقل، فإن جميع المتجهات تتوافق مع العملية XOR لكل بت.

المعادلات الرياضية

[عدل]

على إفتراض أن بالنسبة للأعداد الصحيحة غير السلبية، يمكن كتابة العمليات الثنائية على النحو التالي:

جدول الحقيقة لجميع العمليات المنطقية الثنائية

[عدل]

هناك 16 دالة حقيقة محتملة لمتغيرين ثنائيين؛ وهذا يحدد جدول الحقيقة.

فيما يلي العمليات المكافئة لكل بتتين P و Q:

p q F0 نور

1

معكوس اقتضاء منفي  [لغات أخرى]2 ¬p3 اقتضاء منفي  [لغات أخرى]4 ¬q5 اكس اور

6

ناند

7

و

8

اكس نور

9

q10 إذا/ إذن

11

p12 إذا/ إذن

13

أو

14

T15
1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
المكافئات البنية 0 ليس
(p أوq)
(ليسp)
و q
ليس
p
p و
(ليس q)
ليس
q
p XOR q ليس
(p و q)
p و q ليس
(p XOR q)
q (ليس p)
أوq
p p أو
(ليس q)
p أو q 1

تحولات البت

[عدل]

تعد تحولات البت في بعض الأحيان عمليات بتية، لأنها تعامل القيمة بوصفها سلسلة من البتات وليس ككمية عددية. في هذه العمليات، يتم نقل الأرقام، أو تحويلها، إلى اليسار أو اليمين. تتمتع السجلات في معالج الكمبيوتر بعرض ثابت، لذا سيتم "تحويل" بعض البتات للخارج من السجل في أحد الطرفين، بينما يتم "تحويل" نفس العدد من البتات للداخل من الطرف الآخر؛ وتكمن الاختلافات بين مشغلي تحويل البتات في كيفية تحديد قيم البتات المحولة للداخل.

عنونة البت

[عدل]

إذا كان عرض السجل (غالبًا 32 أو حتى 64) أكبر من عدد البتات (عادةً 8) لأصغر وحدة قابلة للعنونة، والتي تسمى غالبًا بالبايت، فإن عمليات التحويل تحفز مخطط عنونة من البايتات إلى البتات. وبالتالي، يتم أخذ التوجهات من ناحيتي "اليسار" و"اليمين" من الكتابة القياسية للأرقام في تدوين القيمة المكانية، بحيث يزيد التحول إلى اليسار ويقلل التحول إلى اليمين من قيمة الرقم ― إذا تمت قراءة الأرقام اليسرى أولاً، فإن هذا يشكل اتجاهًا كبيرًا. وبغض النظر عن تأثيرات الحدود في كلا طرفي السجل، فإن عمليات التحويل الحسابية والمنطقية تتصرف بنفس الطريقة، ويتم تحويل بمقدار 8 تنقل مواضع البت نمط البت بمقدار 1موضع البايت بالطريقة التالية:

التحول الحسابي

[عدل]
تحويل حسابي إلى اليسار
تحويل حسابي إلى اليمين

في التحول الحسابي (أو ما يسمى بالتحول الثابت)، يتم تجاهل البتات التي يتم إزاحتها خارج أي من الطرفين. في التحول الحسابي إلى اليسار، يتم تحويل الأصفار إلى اليمين؛ وفي التحول الحسابي إلى اليمين، يتم تحويل بت الإشارة (MSB في مكمل الاثنين) إلى اليسار، وبالتالي الحفاظ على إشارة المتغير.

المثال التالي يستخدم سجلًا مكونًا من 8 بتات، يتم تفسيره كمكمل اثنين:

00010111 (عشري +23) SHIFT-يسار
= 00101110  (عشري +46)
10010111 (عشري −105) تحويل يمين
=  11001011 (عشري −53)

وعند النظر إلى المثال نجد أنه في الحالة الأولى، تم نقل الرقم الأيسر إلى ما بعد نهاية السجل، وتم نقل 0 جديد إلى الموضع الأيمن. وفي الحالة الثانية، تم نقل الرقم 1 الموجود في أقصى اليمين للخارج (ربما إلى علم الحمل)، وتم نسخ الرقم 1 الجديد إلى الموضع الأيسر، مع الحفاظ على علامة الرقم. ويتم في بعض الأحيان اختصار التحولات المتعددة إلى تحول واحد بعدد معين من الأرقام. والمثال على ذلك يكمن في:

00010111 (عشري +23) SHIFT-إلى-اليسار-بمقدار-اثنين
= 01011100  (عشري +92)

فالتحول الحسابي إلى اليسار بمقدار n يعادل الضرب في 2 n (بشرط ألا تتجاوز القيمة الحد الأقصى)، في حين أن التحول الحسابي إلى اليمين بمقدار n لقيمة المكمل الثنائي يعادل أخذ الحد الأدنى للقسمة على 2 n. وإذا تم التعامل مع الرقم الثنائي باعتباره مكملًا للواحد، فإن عملية الإزاحة إلى اليمين نفسها تؤدي إلى القسمة على 2 n والتقريب نحو الصفر.

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

[عدل]
التحول المنطقي إلى اليسار
التحول المنطقي الأيمن

في التحول المنطقي (تحول التعبئة الصفرية)، يتم تحويل الأصفار بغرض استبدال البتات المهملة. لذلك، فإن التحولات المنطقية والحسابية إلى اليسار هي نفسها تمامًا.

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

التحول الدائري

[عدل]

شكل آخر من أشكال التحول، يكمن فيما يسمي بالتحول الدائري، أو الدوران بالبت، أو الدوران بالبت.

تناوب

[عدل]
تحويل دائري إلى اليسار أو تدوير
تحويل دائري أو تدوير يمينًا

وفي هذه العملية، والتي تسمى أحيانًا "التدوير بدون حمل"، يتم "تدوير" البتات كما لو تم ربط الطرفين الأيسر والأيمن من السجل. والقيمة التي يتم تحويلها إلى اليمين أثناء التحويل إلى اليسار هي القيمة التي تم تحويلها للخارج إلى اليسار، والعكس صحيح بالنسبة لعملية التحويل إلى اليمين. ويعد هذا مفيدًا إذا كان من الضروري الاحتفاظ بجميع البتات الموجودة، ويُستخدم بشكل متكرر في التشفير الرقمي.

التدوير من خلال الحمل

[عدل]
الدوران إلى اليسار من خلال الحمل
الدوران إلى اليمين من خلال الحمل

التدوير من خلال الحمل هو أحد أشكال عملية التدوير، حيث أن البت الذي يتم نقله للداخل (على أي من الطرفين)، هو بمثابة القيمة القديمة لعلم الحمل، والبت الذي يتم نقله للخارج (على الطرف الآخر) يصبح القيمة الجديدة لعلم الحمل.

ويمكن لدورة واحدة من خلال الحمل محاكاة تحول منطقي أو حسابي لموضع واحد عن طريق إعداد علم الحمل مسبقًا. فعلى سبيل المثال، إذا كانت علامة الحمل تحتوي على 0، فإن x RIGHT-ROTATE-THROUGH-CARRY-BY-ONE هو تحويل منطقي إلى اليمين، وإذا كانت علامة الحمل تحتوي على نسخة من بت الإشارة، فإن x RIGHT-ROTATE-THROUGH-CARRY-BY-ONE هو تحويل حسابي إلى اليمين. ومن أجل هذا السبب، فإن بعض المتحكمات الدقيقة مثل PICs منخفضة الجودة تحتوي فقط على الدوران والتدوير من خلال الحمل، ولا تهتم بتعليمات التحويل الحسابية أو المنطقية.

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

في اللغات عالية المستوى

[عدل]

في عائلة لغات C

[عدل]

في لغات C وC++، مشغلات التحويل المنطقية هي " < < " لتحويل اليسار و" > > " لتحويل اليمين. يتم إعطاء عدد الأماكن التي سيتم تحويلها كحجة ثانية للمشغل. والمثال على ذلك

x = y << 2;

يعين "x" نتيجة تحويل "y" إلى اليسار بمقدار بتتين، وهو ما يعادل الضرب في أربعة.

يمكن أن تؤدي التحولات إلى سلوك محدد بالتنفيذ أو سلوك غير محدد، ومن أجل ذلك يجب توخي الحذر عند استخدامها. إن نتيجة التحويل بعدد بتات أكبر من أو يساوي حجم الكلمة هو سلوك غير محدد في C وC++. [2] [3] إن تحويل القيمة السالبة إلى اليمين هو أمر محدد من قبل التنفيذ، ولا ينصح به من قبل ممارسات الترميز الجيدة؛ [4] تكون نتيجة تحويل القيمة المشار إليها إلى اليسار غير محددة إذا لم يكن من الممكن تمثيل النتيجة في نوع النتيجة.

في لغة C#، يكون التحويل إلى اليمين تحويلًا حسابيًا عندما يكون المتغير الأول عددًا صحيحًا أو طويلًا. وإذا كان المتغير الأول من نوع uint أو ulong، فإن التحول إلى اليمين هو تحولًا منطقيًا. [5]

التحولات الدائرية
[عدل]

تفتقر عائلة لغات C إلى عامل التدوير (على الرغم من أن C++20 يوفر std::rotl و std::rotr)، ولكن يمكن تصنيعه من مشغلي التحويل. ويجب توخي الحذر لضمان صياغة البيان بشكل جيد من أجل تجنب السلوك غير المحدد وهجمات التوقيت في البرامج ذات متطلبات الأمان. [6] على سبيل المثال، التنفيذ الساذج الذي يدور إلى اليسار قيمة غير مشار إليها مكونة من 32 بت x بمقدار n موضع هو ببساطة

uint32_t x = ..., n = ...;
uint32_t y = (x << n) | (x >> (32 - n));

ومع ذلك، يؤدي التحول بمقدار 0 بت إلى سلوك غير محدد في التعبير الأيمن (x >> (32 - n))، وذلك لأن 32 - 0 هو 32 ، و 32 خارج النطاق 0–31 شاملاً. وقد تؤدي المحاولة الثانية إلى

uint32_t x = ..., n = ...;
uint32_t y = n ? (x << n) | (x >> (32 - n)) : x;

حيث يتم اختبار مقدار التحول للتأكد من أنه لا يؤدي إلى تقديم سلوك غير محدد. ومع ذلك، يضيف الفرع مسار كود إضافي ويقدم فرصة لتحليل التوقيت والهجوم، وهو أمر غير مقبول في كثير من الأحيان في البرامج ذات النزاهة العالية. [7] وبالإضافة إلى ذلك، يتم تجميع الكود إلى تعليمات متعددة للآلة، وهو ما يكون في كثير من الأحيان أقل كفاءة من تعليمات المعالج الأصلية. ولتجنب السلوك غير المحدد والفروع تحت مجموعة مصرفات جنو GCC و Clang، يوصى بما يلي. يتم التعرف على النمط بواسطة العديد من المترجمين، وسيقوم المترجم بإصدار تعليمة تدوير واحدة: [8] [9] [10]

uint32_t x = ..., n = ...;
uint32_t y = (x << n) | (x >> (-n & 31));

هناك أيضًا عناصر جوهرية خاصة بالمترجم تنفذ التحولات الدائرية، من قبيل _rotl8، و_rotl16، و_rotr8، و_rotr16 في Microsoft Visual C++. ويوفر Clang بعض العناصر الداخلية للتدوير للتوافق مع مايكروسوفت والتي تعاني من المشكلات المذكورة أعلاه. [11] ولا يقدم GCC تدويرًا جوهريًا. وتوفر Intel أيضًا x86 intrinsics .

جافا

[عدل]

في لغة البرمجة جافا Java ، جميع أنواع الأعداد الصحيحة مشار إليها، لذا فإن مشغلي " < < " و " > > " يقومون بإجراء تحويلات حسابية. وتضيف جافا Java عامل التشغيل " < < < " لإجراء تحويلات منطقية إلى اليمين، ولكن نظرًا لأن عمليات التحويل المنطقية والحسابية إلى اليسار متطابقة بالنسبة للأعداد الصحيحة المشار إليها، فلا يوجد عامل تشغيل " > > > " في جافا Java.

مزيد من التفاصيل حول مشغلي التحويل في جافا Java يكمن في:

  • تسمى المشغلات>> (تحويل إلى اليسار)، << (تحويل إلى اليمين بإشارة)، و <<< (تحويل إلى اليمين بدون إشارة) مشغلات التحويل .
  • نوع تعبير التحويل هو النوع المروج للمتعامل الأيسر. على سبيل المثال، aByte >>> 2 يعادل ((int) aByte) >>> 2 .
  • إذا كان النوع المروج للمتغير الأيسر هو int، فسيتم استخدام البتات الخمسة الأدنى ترتيبًا للمتغير الأيمن فقط كمسافة إزاحة. يبدو الأمر كما لو أن المتغير الأيمن كان خاضعًا لمشغل "و" منطقي بتّي مع قيمة القناع 0x1f (0b11111). [12] وبالتالي، فإن مسافة التحول المستخدمة فعليًا تكون دائمًا في النطاق من 0 إلى 31، شاملة.
  • إذا كان النوع المروج للمتغير الأيسر طويلاً، فسيتم استخدام البتات الستة الأدنى ترتيبًا للمتغير الأيمن فقط كمسافة إزاحة. يبدو الأمر كما لو أن المتغير الأيمن كان خاضعًا لمشغل "و" منطقي بتّي مع قيمة القناع 0x3f (0b111111). [12] وبالتالي، فإن مسافة التحول المستخدمة فعليًا تكون دائمًا في النطاق من 0 إلى 63، شاملة.
  • قيمة n >>> s هي n موضع بت s مُحوَّل إلى اليمين مع امتداد صفري.
  • في عمليات البت والتحويل، يتم تحويل نوع byte ضمناً إلى int . إذا كانت قيمة البايت سلبية، فإن أعلى بت هو واحد، ثم يتم استخدام الواحدات لملء البايتات الإضافية في int. لذا byte b1 = -5; int i = b1 | 0x0200; سيؤدي إلى i == -5 .

جافا سكريبت

[عدل]

تستخدم لغة البرمجة جافا سكريبت JavaScript عمليات بتية لتقييم كل وحدة من وحدتين أو أكثر إلى 1 أو 0.

باسكال

[عدل]

في لغة باسكال، وكذلك في جميع لهجاتها (مثل أوبجكت باسكال وستاندرد باسكال )، فإن مشغلي التحويل المنطقيين لليسار واليمين هما " shl " و" shr " على التوالي. حتى بالنسبة للأعداد الصحيحة المشار إليها، يتصرف shr مثل التحول المنطقي، ولا ينسخ بت الإشارة. يتم إعطاء عدد الأماكن التي سيتم تحويلها كحجة ثانية. على سبيل المثال، يقوم المثال التالي بتعيين x كنتيجة لتحويل y إلى اليسار بمقدار بتين:

x := y shl 2;

أخرى

[عدل]
  • popcount، يستخدم في التشفير
  • عد الأصفار البادئة

التطبيقات

[عدل]

تعتبر العمليات البتية ضرورية بشكل خاص في البرمجة ذات المستوى الأدنى ،مثل برامج تشغيل الأجهزة والرسومات ذات المستوى المنخفض، وتجميع حزم بروتوكول الاتصالات وفك التشفير.

وعلى الرغم من أن الآلات تحتوي في الغالب على تعليمات مدمجة فعالة بغرض إجراء العمليات الحسابية والمنطقية، إلا أنه يمكن إجراء كل هذه العمليات من خلال الجمع بين مشغلي البتات والاختبار الصفري بطرق مختلفة. [13] على سبيل المثال، فيما يلي تنفيذ شبه برمجي لعملية الضرب المصرية القديمة يوضح كيفية ضرب عددين صحيحين عشوائيين a و b ( a أكبر من b ) باستخدام تحويلات البت والجمع فقط:

c  0
while b  0
  if (b and 1)  0
    c  c + a
  left shift a by 1
  right shift b by 1
return c

مثال آخر يكمن في تنفيذ الكود الزائف لعملية الجمع، والذي يوضح كيفية حساب مجموع عددين صحيحين a و b باستخدام مشغلات البتات والاختبار الصفري:

while a  0
  c  b and a
  b  b xor a
  left shift c by 1
  a  c
return b

الجبر البولياني

[عدل]

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

و

[عدل]
  • x & y = y & x
  • x & (y & z) = (x & y) & z
  • x & 0xFFFF = x
  • x & 0 = 0
  • x & x = x

أو

[عدل]
  • x | y = y | x
  • x | (y | z) = (x | y) | z
  • x | 0 = x
  • x | 0xFFFF = 0xFFFF
  • x | x = x

لا

[عدل]
  • ~(~x) = x

XOR

[عدل]
  • x ^ y = y ^ x
  • x ^ (y ^ z) = (x ^ y) ^ z
  • x ^ 0 = x
  • x ^ y ^ y = x
  • x ^ x = 0
  • x ^ 0xFFFF = ~x

وبالإضافة إلى ذلك، يمكن تكوين العملية (XOR) من خلال استخدام العمليات الأساسية الثلاث (و - أو - لا)

  • a ^ b = (a | b) & (~a | ~b)
  • a ^ b = (a & ~b) | (~a & b)

أخرى

[عدل]
  • x | (x & y) = x
  • x & (x | y) = x
  • ~(x | y) = ~x & ~y
  • ~(x & y) = ~x | ~y
  • x | (y & z) = (x | y) & (x | z)
  • x & (y | z) = (x & y) | (x & z)
  • x & (y ^ z) = (x & y) ^ (x & z)
  • x + y = (x ^ y) + ((x & y) << 1)
  • x - y = ~(~x + y)

المعكوسات وحل المعادلات

[عدل]

قد يكون من الصعب حل المتغيرات في الجبر البولياني، لأنه على عكس الجبر العادي، فإن العديد من العمليات لا تحتوي على معكوسات. حيث تؤدي العمليات التي لا تحتوي على معكوسات إلى فقدان بعض بتات البيانات الأصلية عند إجرائها، ومن الصعوبة بمكان استعادة مثل هذه المعلومات المفقودة.

  • له عكس
    • لا
    • إكس أو آر
    • تدوير إلى اليسار
    • تدوير إلى اليمين
  • لا يوجد عكس
    • و
    • أو
    • التحول إلى اليسار
    • التحول إلى اليمين

ترتيب العمليات

[عدل]

يتم تنفيذ العمليات الموجودة في أعلى هذه القائمة أولاً. يمكن مراجعة المقال الرئيسي للحصول على قائمة أكثر اكتمالاً.

  • ( )
  • ~ -
  • * / %
  • + -
  • << >>
  • &
  • ^
  • |

انظر أيضًا

[عدل]

مراجع

[عدل]
  1. ^ "CMicrotek Low-power Design Blog". CMicrotek. اطلع عليه بتاريخ 2015-08-12.
  2. ^ اكتب عنوان المرجع بين علامتي الفتح <ref> والإغلاق </ref> للمرجع :0
  3. ^ "Arithmetic operators - cppreference.com". en.cppreference.com. اطلع عليه بتاريخ 2016-07-06.
  4. ^ "INT13-C. Use bitwise operators only on unsigned operands". CERT: Secure Coding Standards. Software Engineering Institute, Carnegie Mellon University. اطلع عليه بتاريخ 2015-09-07.
  5. ^ "Operator (C# Reference)". Microsoft. اطلع عليه بتاريخ 2013-07-14.
  6. ^ "Near constant time rotate that does not violate the standards?". Stack Exchange Network. اطلع عليه بتاريخ 2015-08-12.
  7. ^ "Near constant time rotate that does not violate the standards?". Stack Exchange Network. اطلع عليه بتاريخ 2015-08-12."Near constant time rotate that does not violate the standards?". Stack Exchange Network. Retrieved 2015-08-12.
  8. ^ "Poor optimization of portable rotate idiom". GNU GCC Project. اطلع عليه بتاريخ 2015-08-11.
  9. ^ "Circular rotate that does not violate C/C++ standard?". Intel Developer Forums. اطلع عليه بتاريخ 2015-08-12.
  10. ^ "Constant not propagated into inline assembly, results in "constraint 'I' expects an integer constant expression"". LLVM Project. اطلع عليه بتاريخ 2015-08-11.
  11. ^ "Constant not propagated into inline assembly, results in "constraint 'I' expects an integer constant expression"". LLVM Project. اطلع عليه بتاريخ 2015-08-11."Constant not propagated into inline assembly, results in "constraint 'I' expects an integer constant expression"". LLVM Project. Retrieved 2015-08-11.
  12. ^ ا ب "Chapter 15. Expressions". oracle.com.
  13. ^ "Synthesizing arithmetic operations using bit-shifting tricks". Bisqwit.iki.fi. 15 فبراير 2014. اطلع عليه بتاريخ 2014-03-08.

روابط خارجية

[عدل]