عملية بتية
في برمجة الحاسوب ، تُجرى عملية البت على سلسلة بتات ، أو مصفوفة بتات ، أو عدد ثنائي (يُعتبر سلسلة بتات) على مستوى بتاته الفردية . وهي عملية سريعة وبسيطة، أساسية للعمليات الحسابية عالية المستوى، ويدعمها المعالج مباشرةً . توفر معظم البنى عددًا محدودًا من عمليات البت ذات القيمة العالية، وتُعرض كتعليمات ذات مُعاملين، حيث تحل النتيجة محل أحد مُعاملي الإدخال.
في المعالجات البسيطة منخفضة التكلفة، عادةً ما تكون العمليات على مستوى البت أسرع بكثير من القسمة، وأسرع بعدة مرات من الضرب، وأحيانًا أسرع بكثير من الجمع. بينما تُجري المعالجات الحديثة عادةً عمليات الجمع والضرب بنفس سرعة العمليات على مستوى البت نظرًا لطول مسارات التعليمات فيها وخيارات التصميم المعماري الأخرى ، إلا أن العمليات على مستوى البت تستهلك عادةً طاقة أقل بسبب انخفاض استخدام الموارد. [ 1 ]
عوامل التشغيل على مستوى البت
في التفسيرات أدناه، يُحسب أي مؤشر لموقع البت من الجانب الأيمن (الأقل أهمية) إلى اليسار. على سبيل المثال، القيمة الثنائية 0001 (العشرية 1) تحتوي على أصفار في كل موقع باستثناء الموقع الأول (أي الموقع الأقصى يمينًا).
لا
عملية النفي الثنائية ، أو المتمم الثنائي ، هي عملية أحادية تُجري عملية نفي منطقي على كل بت، مُكَوِّنةً المتمم الأحادي للقيمة الثنائية المُعطاة. البتات التي قيمتها 0 تُصبح 1، والبتات التي قيمتها 1 تُصبح 0. على سبيل المثال:
ليس 0 111 (العدد العشري 7) = 1000 (الرقم العشري 8)
ليس 10101011 (عشري 171) = 01010100 (عشري 84)
والنتيجة تساوي المتمم الثنائي للقيمة ناقص واحد. إذا تم استخدام حساب المتمم الثنائي، فإن NOT x = -x − 1...
بالنسبة للأعداد الصحيحة غير الموقعة ، فإن المتمم الثنائي للعدد هو انعكاسه عند منتصف نطاقه. على سبيل المثال، بالنسبة للأعداد الصحيحة غير الموقعة ذات 8 بت، NOT x = 255 - xيمكن تمثيل ذلك بيانيًا بخط متجه للأسفل، والذي يعكس فعليًا نطاقًا متزايدًا من 0 إلى 255 إلى نطاق متناقص من 255 إلى 0. ومن الأمثلة البسيطة والواضحة على ذلك عكس صورة رمادية حيث يتم تخزين كل بكسل كعدد صحيح غير موقع.
و

عملية AND الثنائية هي عملية منطقية تأخذ تمثيلين ثنائيين متساويين في الطول، وتُجري عملية AND المنطقية على كل زوج من البتات المتناظرة. بالتالي، إذا كان كلا البتّين في الموضع المُقارن يساويان 1، فإن البت في التمثيل الثنائي الناتج يساوي 1 (1 × 1 = 1)؛ وإلا، فإن النتيجة تكون 0 (1 × 0 = 0 و 0 × 0 = 0). على سبيل المثال:
010 1 (عشري 5) AND 001 1 (عشري 3) = 000 1 (عشري 1)
يمكن استخدام هذه العملية لتحديد ما إذا كانت بتة معينة مضبوطة (1) أو غير مضبوطة (0). على سبيل المثال، عند إعطاء نمط بتات 0011 (العدد العشري 3)، لتحديد ما إذا كانت البتة الثانية مضبوطة، نستخدم عملية AND المنطقية مع نمط بتات يحتوي على 1 فقط في البتة الثانية.
00 1 1 (عشري 3) AND 00 1 0 (العشري 2) = 00 1 0 (عشري 2)
بما أن النتيجة 0010 غير صفرية، نعلم أن البت الثاني في النمط الأصلي قد تم ضبطه. يُطلق على هذا غالبًا اسم إخفاء البتات . (على سبيل المثال، يُستخدم شريط التغطية لتغطية أجزاء لا ينبغي تغييرها أو أجزاء غير مهمة. في هذه الحالة، تُخفي القيم 0 البتات غير المهمة).
يمكن استخدام عملية AND المنطقية لمسح بتات محددة (أو علامات ) من سجل ، حيث يمثل كل بت حالة منطقية فردية . تُعد هذه التقنية طريقة فعالة لتخزين عدد من القيم المنطقية باستخدام أقل قدر ممكن من الذاكرة.
على سبيل المثال، يمكن اعتبار العدد 0110 (العدد العشري 6) مجموعة من أربعة أعلام مرقمة من اليمين إلى اليسار، حيث يكون العلمان الأول والرابع غير مُفعّلين (0)، بينما يكون العلمان الثاني والثالث مُفعّلين (1). ويمكن إلغاء تفعيل العلم الثالث باستخدام عملية AND المنطقية مع النمط الذي يحتوي على صفر فقط في البت الثالث.
0 1 10 (العدد العشري 6) AND 1 0 11 (العشري 11) = 0 0 10 (عشري 2)
بفضل هذه الخاصية، يصبح من السهل تحديد ما إذا كان العدد الثنائي زوجيًا أم فرديًا عن طريق التحقق من قيمة البت الأقل قيمة. باستخدام المثال أعلاه:
011 0 (عشري 6) AND 000 1 (عشري 1) = 000 0 (الرقم العشري 0)
لأن 6 و 1 يساوي صفرًا، فإن 6 يقبل القسمة على اثنين وبالتالي فهو عدد زوجي.
أو

عملية OR الثنائية هي عملية منطقية تأخذ نمطين من البتات متساويين في الطول، وتُجري عملية OR الشاملة على كل زوج من البتات المتناظرة. تكون النتيجة في كل موضع 0 إذا كانت كلتا البتتين 0، وإلا تكون النتيجة 1. على سبيل المثال:
0 101 (عشري 5) أو 0 011 (عشري 3) = 0 111 (العدد العشري 7)
يمكن استخدام عملية OR الثنائية لضبط البتات المحددة في السجل المذكور أعلاه إلى 1. على سبيل المثال، يمكن ضبط البت الرابع من 0010 (العدد العشري 2) عن طريق إجراء عملية OR ثنائية مع النمط الذي تم ضبط البت الرابع فيه فقط:
0 0 1 0 (عشري 2) أو 1 0 0 0 (العدد العشري 8) = 1 0 1 0 (عشري 10)
XOR

عملية XOR الثنائية هي عملية منطقية تُجري عملية XOR على كل زوج من البتات المتناظرة، حيث تأخذ نمطين من البتات متساوية الطول. تكون النتيجة في كل موضع 1 إذا كان أحد البتات فقط يساوي 1، وتكون 0 إذا كان كلاهما يساوي 0 أو كلاهما يساوي 1. في هذه العملية، نقارن بين بتّين، فتكون النتيجة 1 إذا كان البتّان مختلفين، و0 إذا كانا متطابقين. على سبيل المثال:
0 10 1 (عشري 5) XOR 0 01 1 (عشري 3) = 0 11 0 (العدد العشري 6)
يمكن استخدام عملية XOR الثنائية لعكس بتات محددة في سجل (وتسمى أيضًا التبديل أو القلب). يمكن تبديل أي بت عن طريق إجراء عملية XOR معه ومع 1. على سبيل المثال، بالنظر إلى نمط البتات 0010 (العشري 2)، يمكن تبديل البتّين الثاني والرابع عن طريق إجراء عملية XOR ثنائية مع نمط بتات يحتوي على 1 في الموضعين الثاني والرابع.
0 0 1 0 (عشري 2) XOR 1 0 1 0 (عشري 10) = 1 0 0 0 (العدد العشري 8)
يمكن استخدام هذه التقنية لمعالجة أنماط البتات التي تمثل مجموعات من الحالات المنطقية.
يستخدم مبرمجو لغة التجميع ومترجمات التحسين أحيانًا عملية XOR كطريقة مختصرة لضبط قيمة سجل إلى الصفر. إجراء عملية XOR على قيمة ما مع نفسها ينتج عنه دائمًا صفر، وفي العديد من البنى، تتطلب هذه العملية دورات ساعة أقل وذاكرة أقل من تحميل قيمة صفرية وحفظها في السجل.
إذا اعتبرنا مجموعة سلاسل البتات ذات الطول الثابت n (أي كلمات الآلة ) فضاءً متجهيًا ذا n بُعدًافي الملعبثم يتوافق جمع المتجهات مع عملية XOR الثنائية.
المكافئات الرياضية
بافتراضبالنسبة للأعداد الصحيحة غير السالبة ، يمكن كتابة عمليات البت على النحو التالي:
جدول الحقيقة لجميع عوامل التشغيل المنطقية الثنائية
يوجد 16 دالة منطقية محتملة لمتغيرين ثنائيين ؛ وهذا يُحدد جدول حقيقة يُسمى جدول بحث LUT2 ، أو ما يُعرف بدالة منطقية من الرتبة k=2 (مدخلان). يستخدم بعض الموردين مصطلح " الرابط" [ 2 ] للتعليمات التي تحتوي على حقل من 4 بتات يُحدد الرابط الثنائي المُحدد؛ بينما يستخدم آخرون مصطلح " العملية المنطقية" [ 3 ] لـ 16 رمزًا مختلفًا للعمليات.
فيما يلي العمليات المكافئة على مستوى البتات للبتين P و Q:
| ص | q | F 0 | لا 1 | Xq 2 | ¬p 3 | 4 | ¬q 5 | XOR 6 | NAND 7 | و 8 | XNOR 9 | س 10 | إذا/ثم 11 | صفحة 12 | ثم/إذا 13 | أو 14 | تي 15 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | p و (ليس q) | ليس q | p XOR q | ليس (p و q) | p و q | ليس (p XOR q) | q | (ليس p) أو q | ص | p أو (ليس q) | p أو q | 1 | |||
المكافئ الثلاثي هو دالة منطقية LUT3 من الرتبة k=3 (ثلاثة مدخلات)، مما ينتج عنه جدول من 256 عملية، وفي الحوسبة يطلق عليه اسم تعليمات المنطق الثلاثي على مستوى البت .
عمليات تحويل البتات
تُعتبر عمليات إزاحة البتات أحيانًا عملياتٍ على مستوى البتات، لأنها تُعامل القيمة كسلسلة من البتات بدلًا من كونها كمية عددية. في هذه العمليات، تُنقل الأرقام، أو تُزاح ، إلى اليسار أو اليمين. تتميز سجلات معالج الحاسوب بعرض ثابت، لذا تُزاح بعض البتات خارج السجل من أحد طرفيه، بينما يُضاف العدد نفسه من البتات من الطرف الآخر؛ وتكمن الاختلافات بين عوامل إزاحة البتات في كيفية تحديد قيم البتات المُزاحة.
معالجة البتات
إذا كان عرض السجل (غالبًا 32 أو حتى 64 بتًا) أكبر من عدد بتات أصغر وحدة قابلة للعنونة (عادةً 8 بتات)، والتي تُسمى غالبًا بايت، فإن عمليات الإزاحة تُنشئ نظام عنونة من البايتات إلى البتات. وبذلك، تُستمد اتجاهات "اليسار" و"اليمين" من الكتابة القياسية للأرقام بنظام القيمة المكانية ، بحيث تزيد الإزاحة إلى اليسار قيمة الرقم، بينما تُنقصها الإزاحة إلى اليمين - إذا قُرئت الأرقام اليسرى أولًا، فإن هذا يُشكل اتجاهًا كبيرًا (Big-Endian) . وبغض النظر عن تأثيرات الحدود عند طرفي السجل، فإن عمليات الإزاحة الحسابية والمنطقية تتصرف بنفس الطريقة، وتُنقل الإزاحة بمقدار 8 مواضع بت نمط البتات بمقدار موضع بايت واحد على النحو التالي:
ترتيب البيانات حسب النهاية الصغرى : يؤدي الإزاحة إلى اليسار بمقدار 8 خانات إلى زيادة عنوان البايت بمقدار 1. يؤدي الإزاحة إلى اليمين بمقدار 8 خانات إلى تقليل عنوان البايت بمقدار 1. ترتيب البيانات الكبيرة (Big-endian ): يؤدي الإزاحة إلى اليسار بمقدار 8 خانات إلى تقليل عنوان البايت بمقدار 1. يؤدي الإزاحة إلى اليمين بمقدار 8 خانات إلى زيادة عنوان البايت بمقدار 1.
الإزاحة الحسابية


في عملية الإزاحة الحسابية (الإزاحة الثابتة)، تُهمل البتات التي تُزاح من أي من الطرفين. في الإزاحة الحسابية اليسرى، تُزاح الأصفار إلى الداخل من اليمين؛ وفي الإزاحة الحسابية اليمنى، تُزاح بتة الإشارة (البتة الأكثر أهمية في نظام المتمم الثنائي) إلى الداخل من اليسار، مما يحافظ على إشارة المعامل.
يستخدم هذا المثال سجلًا مكونًا من 8 بتات، ويتم تفسيره على أنه متمم ثنائي:
٠٠٠١٠١١١ (عشري +٢٣) إزاحة لليسار = 0010111 0 (عشري +46)
10010111 (عشري -105) إزاحة إلى اليمين = 1 1001011 (عشري -53)
في الحالة الأولى، تم تحريك الرقم الأيسر إلى ما بعد نهاية السجل، وتم إدخال صفر جديد في أقصى اليمين. في الحالة الثانية، تم تحريك الرقم 1 الأيمن إلى الخارج (ربما إلى علامة الحمل )، وتم نسخ رقم 1 جديد إلى أقصى اليسار، مع الحفاظ على إشارة الرقم. أحيانًا يتم اختصار عمليات التحريك المتعددة إلى عملية تحريك واحدة بعدد معين من الأرقام. على سبيل المثال:
٠٠٠١٠١١١ (عشري +٢٣) إزاحة لليسار بمقدار اثنين = 010111 00 (عشري +92)
الإزاحة الحسابية إلى اليسار بمقدار n تُكافئ الضرب في 2n ( شريطة ألا يتجاوز الناتج الحد الأقصى )، بينما الإزاحة الحسابية إلى اليمين بمقدار n لقيمة متممة ثنائية تُكافئ أخذ الجزء الصحيح من ناتج القسمة على 2n . إذا تم التعامل مع العدد الثنائي كمتمم أحادي ، فإن عملية الإزاحة نفسها إلى اليمين تُؤدي إلى القسمة على 2n والتقريب نحو الصفر .
التحول المنطقي
في عملية الإزاحة المنطقية (إزاحة ملء الأصفار)، تُستبدل البتات المهملة بأصفار. لذلك، فإن الإزاحة المنطقية والحسابية إلى اليسار متطابقتان تمامًا.
ومع ذلك، بما أن الإزاحة المنطقية لليمين تُدخل بتات القيمة 0 في البت الأكثر أهمية، بدلاً من نسخ بت الإشارة، فهي مثالية للأعداد الثنائية غير الموقعة، بينما الإزاحة الحسابية لليمين مثالية للأعداد الثنائية الموقعة بنظام المتمم الثنائي .
نوبة عمل دائرية
هناك شكل آخر من أشكال الإزاحة وهو الإزاحة الدائرية ، أو الدوران على مستوى البت، أو دوران البت .
تناوب
في هذه العملية، التي تُسمى أحيانًا " تدوير بدون حمل "، تُدار البتات كما لو أن طرفي السجل الأيمن والأيسر متصلان. القيمة التي تُزاح إلى اليمين أثناء الإزاحة إلى اليسار هي القيمة التي أُزيحت إلى اليسار، والعكس صحيح في عملية الإزاحة إلى اليمين. يُفيد هذا في حال الحاجة إلى الاحتفاظ بجميع البتات الموجودة، ويُستخدم بكثرة في التشفير الرقمي .
التناوب بين الحمل
التدوير من خلال الحمل هو شكل مختلف من عملية التدوير، حيث يكون البت الذي يتم إزاحته للداخل (على أي من الطرفين) هو القيمة القديمة لعلامة الحمل، ويصبح البت الذي يتم إزاحته للخارج (على الطرف الآخر) هو القيمة الجديدة لعلامة الحمل.
يمكن لعملية تدوير واحدة مع تمرير الحمل محاكاة إزاحة منطقية أو حسابية بمقدار خانة واحدة عن طريق ضبط علامة الحمل مسبقًا. على سبيل المثال، إذا كانت علامة الحمل تحتوي على 0، فإنها x RIGHT-ROTATE-THROUGH-CARRY-BY-ONEتُجري إزاحة منطقية إلى اليمين، وإذا كانت تحتوي على نسخة من بت الإشارة، فإنها x RIGHT-ROTATE-THROUGH-CARRY-BY-ONEتُجري إزاحة حسابية إلى اليمين. لهذا السبب، تحتوي بعض المتحكمات الدقيقة، مثل متحكمات PIC منخفضة التكلفة، على تعليمات التدوير والتدوير مع تمرير الحمل فقط ، ولا تستخدم تعليمات الإزاحة الحسابية أو المنطقية.
تُعدّ خاصية التدوير عبر الحمل مفيدةً للغاية عند إجراء عمليات إزاحة على أرقام أكبر من حجم الكلمة الأصلي للمعالج ، لأنه إذا تم تخزين رقم كبير في سجلين، فإن البت الذي يتم إزاحته من أحد طرفي السجل الأول يجب أن يدخل من الطرف الآخر للسجل الثاني. مع خاصية التدوير عبر الحمل، يتم "حفظ" هذا البت في علامة الحمل أثناء عملية الإزاحة الأولى، ويكون جاهزًا للإزاحة أثناء عملية الإزاحة الثانية دون أي تحضير إضافي.
في اللغات عالية المستوى
في عائلة لغات C
في لغتي C و C++، تُستخدم معاملات الإزاحة المنطقية " " للإزاحة إلى اليسار و " " للإزاحة إلى اليمين. ويُحدد عدد الخانات المراد إزاحتها كوسيط ثانٍ للمعامل. على سبيل المثال،<<>>
x = y << 2 ;يُسند xنتيجة الإزاحة yإلى اليسار بمقدار بتين، وهو ما يعادل الضرب في أربعة.
قد تؤدي عمليات الإزاحة إلى سلوك مُحدد من قِبل التنفيذ أو سلوك غير مُحدد ، لذا يجب توخي الحذر عند استخدامها. تُعد نتيجة الإزاحة بعدد بتات أكبر من أو يساوي حجم الكلمة سلوكًا غير مُحدد في لغتي C و C++. [ 4 ] [ 5 ] تُعد إزاحة قيمة سالبة إلى اليمين سلوكًا مُحددًا من قِبل التنفيذ ولا يُنصح به في ممارسات البرمجة الجيدة؛ [ 6 ] تُعد نتيجة إزاحة قيمة مُوقّعة إلى اليسار غير مُحددة إذا تعذر تمثيل النتيجة في نوع النتيجة. [ 4 ]
في لغة C#، تُعتبر عملية الإزاحة إلى اليمين إزاحة حسابية عندما يكون المعامل الأول من نوع int أو long. أما إذا كان المعامل الأول من نوع uint أو ulong، فإن عملية الإزاحة إلى اليمين تُعتبر إزاحة منطقية. [ 7 ]
نوبات العمل الدائرية
تفتقر لغات عائلة C إلى عامل التدوير (على الرغم من أن C++20 توفر عاملي التدوير std::rotlوالإزاحة std::rotr)، ولكن يمكن توليد عامل تدوير من عوامل الإزاحة. يجب توخي الحذر لضمان صحة صياغة العبارة لتجنب السلوك غير المحدد وهجمات التوقيت في البرامج ذات المتطلبات الأمنية. [ 8 ] على سبيل المثال، التنفيذ البسيط الذي يقوم بتدوير قيمة غير موقعة 32 بت إلى اليسار xبمقدار nعدد من المواضع هو ببساطة
uint32_t x = ..., n = ...; uint32_t y = ( x << n ) | ( x >> ( 32 - n ));مع ذلك، يؤدي تغيير قيمة بمقدار 0بتات إلى سلوك غير محدد في التعبير الأيمن (x >> (32 - n))لأن ، 32 - 0وتقع خارج النطاق 0-31 شاملًا. قد تؤدي المحاولة الثانية إلى3232
uint32_t x = ..., n = ...; uint32_t y = n ? ( x << n ) | ( x >> ( 32 - n )) : x ;حيث يتم اختبار مقدار الإزاحة للتأكد من عدم تسببه في سلوك غير محدد. مع ذلك، يُضيف هذا الفرع مسارًا برمجيًا إضافيًا، مما يُتيح فرصة لتحليل التوقيت والهجوم، وهو أمر غير مقبول غالبًا في البرامج عالية الأمان. [ 8 ] إضافةً إلى ذلك، يُترجم الكود إلى عدة تعليمات آلية، وهو ما يكون غالبًا أقل كفاءة من التعليمات الأصلية للمعالج.
لتجنب السلوك غير المحدد والتفرعات في بيئة GCC و Clang ، يُوصى بما يلي. يتعرف العديد من المترجمات على هذا النمط، وسيصدر المترجم تعليمة تدوير واحدة: [ 9 ] [ 10 ] [ 11 ]
uint32_t x = ..., n = ...; uint32_t y = ( x << n ) | ( x >> ( - n & 31 ));توجد أيضًا دوالّ داخلية خاصة بالمترجمات تُنفّذ عمليات الإزاحة الدائرية ، مثل _rotl8 و_rotl16 و_ rotr8 و_rotr16 في Microsoft Visual C++ . يوفر Clang بعض الدوالّ الداخلية للتدوير من أجل التوافق مع Microsoft، والتي تعاني من المشاكل المذكورة أعلاه. [ 11 ] قدّم GCC 15 الدوالّ __builtin_stdc_rotate_leftالداخلية __builtin_stdc_rotate_right، لكنه لم يُحسّنها بالشكل الأمثل. كما توفر Intel دوالّ داخلية x86 .
جافا
في لغة جافا ، جميع أنواع الأعداد الصحيحة مُوقّعة، لذا فإنّ المعاملين " " و " " يُجريان عمليات إزاحة حسابية. تُضيف جافا المعامل " " لإجراء عمليات إزاحة منطقية إلى اليمين، ولكن بما أنّ عمليات الإزاحة المنطقية والحسابية إلى اليسار متطابقة بالنسبة للأعداد الصحيحة المُوقّعة، فلا يوجد معامل " " في جافا.<<>>>>><<<
مزيد من التفاصيل حول عوامل الإزاحة في جافا: [ 12 ]
- تُسمى عوامل التشغيل
<<(الإزاحة إلى اليسار)، و>>(الإزاحة إلى اليمين مع الإشارة)، و (الإزاحة إلى اليمين بدون إشارة) عوامل الإزاحة .>>> - نوع تعبير الإزاحة هو النوع المُرَقَّى للمعامل الأيسر. على سبيل المثال،
aByte >>> 2يُكافئ .((int)aByte)>>>2 - إذا كان نوع المعامل الأيسر المُرَوَّج هو عدد صحيح (int)، فسيتم استخدام البتات الخمس الأدنى رتبة فقط من المعامل الأيمن كمسافة إزاحة. ويُشبه الأمر كما لو أن المعامل الأيمن خضع لعملية AND منطقية ثنائية (&) بقيمة القناع 0x1f (0b11111). [ 13 ] وبالتالي، فإن مسافة الإزاحة المستخدمة فعليًا تكون دائمًا ضمن النطاق من 0 إلى 31، شاملةً الحدين.
- إذا كان نوع المعامل الأيسر المُرَقَّى طويلًا، فسيتم استخدام البتات الستة الأدنى رتبةً فقط من المعامل الأيمن كمسافة إزاحة. ويُشبه الأمر كما لو أن المعامل الأيمن خضع لعملية AND منطقية ثنائية بقيمة القناع 0x3f (0b111111). [ 13 ] وبالتالي، فإن مسافة الإزاحة المستخدمة فعليًا تقع دائمًا ضمن النطاق من 0 إلى 63، شاملةً الحدين.
- قيمة
n >>> sهي n موضع بت مُزاحة لليمين مع امتداد صفري. - في عمليات البت والإزاحة،
byteيتم تحويل النوع ضمنيًا إلىint. إذا كانت قيمة البايت سالبة، فإن أعلى بت هو واحد، ثم تُستخدم الآحاد لملء البايتات الإضافية في العدد الصحيح. لذا ستكون النتيجة .byteb1=-5;inti=b1|0x0200;i == -5
جافا سكريبت
تستخدم لغة جافا سكريبت عمليات البت لتقييم كل خانة من خانتين أو أكثر من خانات الوحدات إلى 1 أو 0. [ 14 ]
باسكال
في لغة باسكال، وكذلك في جميع لهجاتها (مثل أوبجكت باسكال وستاندرد باسكال )، يُرمز لمعاملي الإزاحة المنطقية لليسار واليمين بـ " shl" و " shr" على التوالي. حتى مع الأعداد الصحيحة الموقعة، shrيتصرف المعامل كإزاحة منطقية، ولا ينسخ بت الإشارة. يُحدد عدد الخانات المراد إزاحتها كمعامل ثانٍ. على سبيل المثال، يُسند الكود التالي إلى x نتيجة إزاحة y إلى اليسار بمقدار بتين:
x := y shl 2 ;آخر
- عدد السكان ، المستخدم في علم التشفير
- احسب الأصفار البادئة
- النظام العشري المشفر ثنائياً
التطبيقات
تُعد عمليات البت ضرورية بشكل خاص في البرمجة منخفضة المستوى مثل برامج تشغيل الأجهزة ، والرسومات منخفضة المستوى، وتجميع حزم بروتوكول الاتصالات، وفك التشفير.
على الرغم من أن الآلات غالبًا ما تحتوي على تعليمات مدمجة فعّالة لإجراء العمليات الحسابية والمنطقية، إلا أنه يمكن تنفيذ جميع هذه العمليات من خلال دمج عوامل التشغيل على مستوى البت واختبار الصفر بطرق متنوعة. [ 15 ] على سبيل المثال، إليك تطبيقًا لخوارزمية الضرب المصرية القديمة باستخدام الشفرة الزائفة ، يوضح كيفية ضرب عددين صحيحين عشوائيين ( أكبر من ) باستخدام عمليات إزاحة البت والجمع فقط:abab
c ← 0 طالما b ≠ 0 إذا كان ( b و 1 ) ≠ 0 c ← c + a إزاحة a لليسار بمقدار 1 إزاحة b لليمين بمقدار 1 إرجاع cمثال آخر هو تطبيق شبه كودي لعملية الجمع، يوضح كيفية حساب مجموع عددين صحيحين aباستخدام bعوامل التشغيل على مستوى البت واختبار الصفر:
طالما أن a ≠ 0، فإن c ← b و a b ← b xor a، ثم إزاحة c إلى اليسار بمقدار 1، ثم a ← c، ثم إرجاع bالجبر البولياني
أحيانًا يكون من المفيد تبسيط التعبيرات المعقدة المكونة من عمليات منطقية ثنائية، كما هو الحال عند كتابة المترجمات. يهدف المترجم إلى ترجمة لغة برمجة عالية المستوى إلى أكثر شفرة آلية كفاءة ممكنة. تُستخدم الجبر البولياني لتبسيط التعبيرات المنطقية الثنائية المعقدة.
و
x & y = y & xx & (y & z) = (x & y) & zx & 0xFFFF = x[ 16 ]x & 0 = 0
x & x = x
أو
x | y = y | xx | (y | z) = (x | y) | zx | 0 = xx | 0xFFFF = 0xFFFFx | x = x
لا
~(~x) = x
XOR
x ^ y = y ^ xx ^ (y ^ z) = (x ^ y) ^ zx ^ 0 = xx ^ y ^ y = xx ^ x = 0x ^ 0xFFFF = ~x
بالإضافة إلى ذلك، يمكن تكوين XOR باستخدام العمليات الأساسية الثلاث (AND، OR، NOT).
a ^ b = (a | b) & (~a | ~b)a ^ b = (a & ~b) | (~a & b)
آحرون
x | (x & y) = xx & (x | y) = x~(x | y) = ~x & ~y~(x & y) = ~x | ~yx | (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)
المعكوسات وحل المعادلات
قد يكون من الصعب إيجاد قيم المتغيرات في الجبر البولياني، لأنه على عكس الجبر العادي، لا تمتلك العديد من العمليات معكوسات. تفقد العمليات التي لا تمتلك معكوسات بعض بتات البيانات الأصلية عند تنفيذها، ولا يمكن استعادة هذه المعلومات المفقودة.
- له عكس
- لا
- XOR
- أدر لليسار
- أدر إلى اليمين
- لا يوجد عكس
- و
- أو
- انعطف يسارًا
- انعطف يمينًا
ترتيب العمليات
تُنفذ العمليات الموجودة في أعلى هذه القائمة أولاً. راجع المقالة الرئيسية للاطلاع على قائمة أكثر شمولاً.
انظر أيضاً
مراجع
- ↑ "مدونة سي مايكروتك لتصميمات الطاقة المنخفضة" . سي مايكروتك . تم الاطلاع بتاريخ 12 أغسطس 2015 .
- ↑ "العمليات المتصلة" (ملف PDF) . دليل مرجعي - نظام معالجة البيانات IBM 7030 (ملف PDF) . شركة IBM . أغسطس 1961. الصفحات 74-77 . A22-6530-2 . تم الاطلاع عليه بتاريخ 5 مايو 2015 - عبر bitsavers.org.
- ↑ "الحساب والمنطق" (ملف PDF) . معالج البيانات المبرمج 6 - دليل المستخدم (ملف PDF) . شركة ديجيتال إكويبمنت . أغسطس 1964. صفحة 32. F-65 . تم الاطلاع عليه بتاريخ 5 مايو 2015 - عبر bitsavers.org.
- 1 2 JTC1/SC22/WG14 N843 "لغة البرمجة C" مؤرشفة بتاريخ 2022-08-03 في Wayback Machine ، القسم 6.5.7
- ↑ "المعاملات الحسابية - cppreference.com" . en.cppreference.com . تم الاطلاع عليه بتاريخ 2016-07-06 .
- ↑ "INT13-C. استخدم عوامل التشغيل الثنائية فقط على المعاملات غير الموقعة" . CERT: معايير الترميز الآمن . معهد هندسة البرمجيات، جامعة كارنيجي ميلون . تم الاطلاع عليه بتاريخ 7 سبتمبر 2015 .
- ↑ "المُعامل (مرجع C#)" . مايكروسوفت . تم الاسترجاع في 14 يوليو 2013 .
- 1 2 "دوران بزمن شبه ثابت لا يخالف المعايير؟" . شبكة ستاك إكستشينج . تم الاسترجاع في 12 أغسطس 2015 .
- ↑ "ضعف تحسين أسلوب التدوير المحمول" . مشروع GNU GCC . تم الاسترجاع في 11 أغسطس 2015 .
- ↑ "دوران دائري لا يخالف معايير لغة C/C++؟" . منتديات مطوري إنتل . تم الاطلاع عليه بتاريخ 12 أغسطس 2015 .
- 1 2 "لم يتم تمرير الثابت إلى التجميع المضمن، مما ينتج عنه " القيد 'I' يتوقع تعبيرًا ثابتًا صحيحًا " " . مشروع LLVM . تم الاسترجاع في 11-08-2015 .
- ↑ مواصفات لغة جافا، القسم 15.19. عوامل الإزاحة
- 1 2 "الفصل 15. التعبيرات" . oracle.com .
- ↑ "JavaScript Bitwise" . W3Schools.com .
- ↑ "توليف العمليات الحسابية باستخدام حيل إزاحة البتات" . Bisqwit.iki.fi. 2014-02-15 . تم الاطلاع عليه بتاريخ 2014-03-08 .
- ↑ في جميع أنحاء هذه المقالة، يشير 0xFFFF إلى جميع البتات 1 لعرض نوع البيانات الخاص بك، وليس إلى القيمة الفعلية FFFF 16 .
- ↑ - هنا نفي وليس طرح
- ↑ - هنا عملية طرح، وليست نفيًا
روابط خارجية
- تدعم الآلة الحاسبة الثنائية عبر الإنترنت عمليات AND و OR و XOR الثنائية
- XORcat ، أداة لملفات/تدفقات XOR الثنائية
- القسمة باستخدام إزاحة البتات
- " عمليات البتات Mod N " من إعداد إنريكي زيليني، مشروع عروض وولفرام التوضيحية .
- " مخططات تركيب العمليات الثنائية " من إعداد إنريكي زيليني، مشروع عروض وولفرام التوضيحية.
- الحساب الثنائي
- المشغلون (البرمجة)
- الجبر البولياني





