علوم وفضاء

invert: هل تعادل قلب إشارة العدد؟

قلب النمط نفسه مع قراءتين للناتج بحسب النوع.
القيم مؤلفة؛ البايت f6 يقرأ 246 أو −10 بحسب النوع.

invert تقلب بتات الأعداد الصحيحة عنصرًا بعنصر؛ لا نقرأ اسمها بوصفه تغييرًا للإشارة العددية. [1]

أي عكس نطلب؟

invert تقلب بتات الأعداد الصحيحة عنصرًا بعنصر؛ لا نقرأ اسمها بوصفه تغييرًا للإشارة العددية. [1]

نقصد بالعكس العددي هنا العدد الذي تجمعه إلى الأصل لتحصل على صفر في حساب الأعداد الصحيحة: للعدد 9 يكون −9، وللعدد −126 يكون 126. نحسب هذه المقارنة بأعداد Python الصحيحة، لا باستدعاء سالب على مصفوفة int8.

أما السؤال عن invert فيتابع البتات المخزنة، ثم يفسر النتيجة وفق النوع المسجل. لا يكفي أن ينتهي أحد المثالين إلى سالب كي نجعل العملية مرادفًا لقلب علامة العدد.

لذلك نثبت عرضًا من ثماني خانات ونقارن uint8 وint8 على البايتات نفسها. لا نحول الأعداد إلى مقارنات منطقية، ولا نختبر logical_not أو اختبار حقيقة العدد.

البايتات نفسها وقراءتان

view بنوع بيانات مختلف قد يعيد تفسير بايتات الذاكرة. [2]

أنشأنا u=np.array([9,130],dtype=np.uint8)، ثم s=u.view(np.int8). الشكل (2,) في الاثنين؛ القيم المعروضة لـs هي [9,-126]. بايتات المدخلين بالصيغة السداسية 0982 في هذا المثال ذي البايت الواحد لكل عنصر.

نفذنا unsigned_result=np.invert(u) وsigned_result=np.invert(s). الأول [246,125] من uint8، والثاني [-10,125] من int8؛ شكل كل منهما (2,). سجل tobytes للناتجين f67d، أي البايتان نفسيهما رغم اختلاف قراءة الخانة الأولى.

العدد 9 يبدأ بالنمط 00001001. قلب كل خانة يعطي 11110110؛ أوزانه دون إشارة تجمع إلى 246، وبوزن −128 للخانة العليا يصبح −128+64+32+16+4+2=−10. الرقم −10 يختلف عن العكس العددي −9.

البايت 130 يبدأ بالنمط 10000010. قراءته الموقعة −128+2=−126، وقلب البتات يعطي 01111101، الذي يقرأ 125 في النوعين. العكس العددي للمدخل الموقع −126 هو 126، فلا يطابق 125 رغم اتفاق قراءتي الناتج هنا.

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

الصفر والقلب مرتين

في تحكم منفصل أنشأنا u=[0] من uint8 وعرضه من int8، ثم نفذنا invert على كل منهما. أعاد الأول [255] والثاني [-1]؛ نمط الناتج ff، أي ثماني خانات كلها 1.

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

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

قرأنا ~u و~s أيضًا، فطابقت القيم المسجلة من invert في نطاق التنفيذ. حفظنا بايتات u وs قبل النداءات وبعدها؛ بقيت ثابتة، وفحص مشاركة الذاكرة بين كل ناتج ومدخله أعطى False في حالاتنا.

نقارن عكس الإشارة بأعداد Python بعد قراءة int8؛ لم نجرب تحويلًا عدديًا عبر astype، أو كتابة إلى العرض، أو معالجة فيض محتمل من سالب على int8. هذه أسئلة مختلفة عن النتيجة التي سجلناها.

الصفر يميز قلب البتات من العكس العددي الرياضي.
قلب بايت الصفر يعطي ff؛ العكس العددي الرياضي يبقى صفرًا.

مرجع بتات مستقل ونطاق معلوم

لكل بايت v من 0 إلى 255، استخرج مرجع Python رقم الخانة k بالحساب (v//2**k)%2. استبدل كل رقم بواحد ناقصه، وضربه في وزن 2**k ثم جمع الخانات الثماني. لا يستخدم هذا المرجع عاملًا بتيًا أو دالة NumPy لقلب البتات.

وللقراءة الموقعة، جمع المرجع أوزان الخانات السبع الدنيا ثم طرح وزن 128 عند وجود 1 في الخانة العليا. استعمل القاعدة نفسها لقراءة المدخل والناتج، دون استدعاء view أو تحويل NumPy لبناء التوقع.

في نطاقنا، قراءة الناتج الموقع تساوي −s−1. إذا كان s غير سالب، فالقراءة غير الموقعة بعد القلب 255−s، وطرح 256 منها يعطي −s−1. وإذا كان s سالبًا، فبايته s+256، وقلبه يعطي 255−(s+256)=−s−1.

هذا يختلف عن −s لكل عدد صحيح في نطاقنا؛ مساواة العبارتين تتطلب −1=0. كتبنا العلاقة من مرجع الخانات، ثم قارناها بكل مخرجات int8 المسجلة؛ لا نأخذ صياغة تقريبية عن قلب الإشارة بديلًا لحساب البتات.

عدد حالات الشبكة 256، كل منها مصفوفة من بايت واحد. أضفنا المثال ذي البايتين ونداء الصفر المكرر، فصار عدد النداءات 258. لا ندعي أنها 258 قيمة بايت مختلفة.

لكل نداء ثمانية فحوص: قراءة المدخلين وبايتاتهما؛ الخرج غير الموقع ونوعه وشكله؛ الخرج الموقع ونوعه وشكله؛ اتفاق بايتات الخرج مع المرجع؛ العلاقة الموقعة واختلافها عن العكس العددي؛ مطابقة ~؛ العودة بعد القلب الثاني؛ وثبات المدخل وغياب مشاركة ذاكرة النتائج المسجلة. مرت 258×8=2064 عملية فحص.

اقتصرنا على uint8 وعرض int8 ذي عرض البايت نفسه، وعلى invert دون out أو where. لم نفحص أنواعًا عائمة أو object أو bool، أو عروض بتات أخرى، أو مصفوفات غير متجاورة، أو تحويل astype، أو تعديل ذاكرة العرض، أو الأداء، أو سياسة فيض حسابية عامة.

المدخل الموقعinvert بإشارةالعكس العددي الرياضي
9،−126−10،125−9،126
0−10

للتوسع: الجمع والطرح في النظام الثنائي.

المراجع

  1. NumPy invert
  2. NumPy ndarray.view

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