العدد −9 واحد، لكن نصه الثنائي قد يبدأ بشرطة أو يتكون من آحاد وأصفار فقط. في binary_repr يحدد width طريقة كتابة السالب. سنقرأ ثلاثة نصوص للقيمة نفسها، ثم نفحص لماذا لا يعيد تحويل النص إلى عدد في الأساس 2 القيمة السالبة تلقائيًا.
النص والعرض
توثق binary_repr إرجاع سلسلة؛ للسالب تسبقها شرطة دون width، أو تعيد متممه الثنائي بالعرض المحدد. العرض غير الكافي يثير خطأ. [1]
توثق int قراءة نص بأساس محدد، مع إشارة اختيارية. [2] لا تحمل سلسلة من الآحاد والأصفار وحدها في أمثلتنا طلبًا لفك المتمم الثنائي؛ سنحفظ العرض والتفسير معها.
وتعرّف base_repr وسيط padding بأنه عدد أصفار تضاف يسارًا. [3] قرأنا هذا التعريف للتمييز بين الوسيطين؛ لم نشغل base_repr أو نقارن سرعتها في تجربتنا.
نعمل على أعداد Python الصحيحة، في NumPy 2.3.5 على CPython 3.12.14. ما نحصل عليه نص str، لا مصفوفة بايتات ولا صورة لذاكرة معالج. الأعداد التالية مؤلفة بلا وحدة قياس.
ثلاث قراءات للسالب
بدأنا n=-9. أعادت np.binary_repr(n) النص "-1001". المقدار 9 يساوي 8+1، لذلك نقرأ الخانات 1001 بوصفها المقدار، والشرطة السابقة بوصفها الإشارة.
أعادت np.binary_repr(n,width=6) النص "110111". نحسب في مرجعنا 2**6−9=55، ونكتبه في ست خانات: 32+16+4+2+1=55. تفسيره متممًا ثنائيًا بهذا العرض يعيد 55−64=−9.
مع width=7 كان النص "1110111". الحساب 2**7−9=119، وأوزان الآحاد تجمع 64+32+16+4+2+1=119. وبالتفسير المعلن نطرح 128، فنعود إلى −9.
لم تتغير القيمة الأصلية بين الاستدعاءات. تغير العرض، وتغير النص الناتج معه. لا ننقل إحدى السلسلتين منفردة ثم نفترض أن القارئ يعرف هل نعني عددًا غير سالب أم متممًا ثنائيًا موقعًا.
نفذنا int(s,2) لكل نص ناتج. أعاد النص ذو الشرطة −9 مباشرةً، وأعاد النصان دون شرطة 55 و119. في هذه القراءة لا توجد إشارة سالبة في النص؛ طرح قوة الاثنين خطوة حسابية إضافية تعتمد على العرض المعروف.
الكفاية والتحكم الموجب
أثار np.binary_repr(-9,width=4) الاستثناء ValueError في تشغيلنا؛ لم يعد نصًا مقتطعًا. رسالة التشغيل أشارت إلى الحاجة إلى خمس خانات بدل الأربع؛ نوع الاستثناء هنا ملاحظة للإصدار المختبر.
الأربع خانات ذات التفسير الموقع بالمتمم الثنائي تغطي في حسابنا −8 إلى 7. لذلك لا يمكن أن تمثل −9 بهذا التفسير. لم نجمع أعدادًا أو نحذف حملًا خارج سجل لكي نفسر الرفض.
نفذنا تحكمًا مستقلًا np.binary_repr(9,width=4)، فأعاد "1001"؛ وأعاد int("1001",2) العدد 9. قبول العرض هنا يخص كتابة العدد الموجب، ولا يضمن أن تفسير النص لاحقًا بالمتمم الثنائي سيعطيه القيمة نفسها.
لو فرضنا نحن تفسيرًا موقعًا بأربع خانات لهذا النص، لكان حسابه 9−16=−7. هذا حساب لتفسير آخر، وليس القيمة التي أعادها int في التجربة أو تغييرًا في مدخل binary_repr.
أما np.binary_repr(9,width=3) فأثار ValueError؛ ثلاث خانات غير سالبة لا تسع 9 في حسابنا. نكتب حالة الرفض كما حدثت، دون اختراع نص ناقص أو عد الاستثناء عددًا ناتجًا.

الحصر وحدود التجربة
اخترنا المقادير الصحيحة من 9 إلى 25، أي 17 مقدارًا؛ مع السالب والموجب صار لدينا 34 مدخلًا عدديًا مختلفًا. لكل سالب أربعة إعدادات: دون width، وبعرض 6 و7 و4. ولكل موجب إعدادان: دون width وبعرض 5.
إذن 17×6=102 استدعاء binary_repr. أضفنا تحكمي +9 بعرض 4 وبعرض 3، فصار العدد 104. انتهت 86 منها بنصوص، و18 باستثناء ValueError؛ لا نعد محاولة مرفوضة نصًا صالحًا.
حولنا النصوص الستة والثمانين بـint(s,2)، فحفظنا 86 عددًا صحيحًا إضافيًا. المجموع 190 استدعاء مسمى و190 نتيجة مسجلة: 86 نصًا و86 عددًا و18 استثناء. حسابات استعادة السالب والنصوص المتوقعة خارج عد المخارج الأصلية.
بنى المرجع النص المتوقع بقسمة صحيحة متكررة على اثنين، وإضافة الشرطة أو أصفار اليسار وفق الحالة. للسالب ذي العرض الكافي استعمل 2**w+n؛ لم يولد التوقع بـbinary_repr أو bin أو format. وجمع أوزان الخانات راجع نتائج int بصورة مستقلة.
لم نفحص الصفر أو حدود المجال القصوى أو العروض السالبة وغير الصحيحة أو أنواع NumPy الصحيحة أو الكسور أو المصفوفات أو تنسيقات الملفات أو الذاكرة الفعلية أو الأداء. النتيجة تخص التشغيل المسجل. احتفظ بالنص والعرض وقاعدة التفسير معًا.
| n=-9 setting | Text s | int(s,2) | Signed recovery |
|---|---|---|---|
| width omitted | -1001 | -9 | -9 |
| width=6 | 110111 | 55 | 55-64=-9 |
| width=7 | 1110111 | 119 | 119-128=-9 |
للتوسع: الحساب في النظام الثنائي.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
