محوّل أنظمة العد

يحوّل عددًا بين الثنائي والثماني والعشري والست عشري وأي أساس من 2 إلى 36، مع المتمّم الثنائي بعرض ثابت وشبكة بتات قابلة للنقر.

العرض
ثنائي
ثماني
عشري
ست عشري
الأساس
البتات — انقر للقلب

العرض 8 بت، المضبوط منها 8

ما الذي تفعله هذه الأداة

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

وما يفصله عن حاسبة مدرسية هو مُحدِّد العرض وشبكة البتات. اختر 8 أو 16 أو 32 أو 64 بتًا فتأخذ الأعداد السالبة تمثيلها الحقيقي في الآلة بدل إشارة السالب، ويصبح كل بت شيئًا يمكن النقر عليه.

ما الأساس في حقيقته

الأساس هو عدد الأرقام المتاحة قبل أن تنفد فيلزم الحمل. للعشري عشرة، فبعد 9 يأتي 10. وللثنائي اثنان، فبعد 1 يأتي 10. وموضع كل رقم هو قوة للأساس، وهذا كل ما في الأمر:

1011           # العدد، بالأساس 2
1 x 8 = 8      # البت 3
0 x 4 = 0      # البت 2
1 x 2 = 2      # البت 1
1 x 1 = 1      # البت 0
8+0+2+1 = 11   # المجموع، بالعشري

والأسس فوق العشرة تحتاج أكثر من عشرة رموز، فتستعير حروفًا: الست عشري يمضي 0-9 ثم a-f، حيث a تساوي 10 وf تساوي 15. ويستمر ذلك حتى الأساس 36 الذي يستعمل كل رقم وكل حرف — وهو أكبر أساس يمكن كتابته بالأبجدية البسيطة، وسبب توقف هذه الأداة عنده.

لماذا الست عشري دون غيره

الست عشري شائع لسبب محدد: 16 هو 2 أُس 4، فرقم ست عشري واحد يغطي أربعة بتات بالضبط. وهذا يجعل التحويل بينه وبين الثنائي بحثًا في جدول بلا حساب — إذ يتمدد كل رقم ست عشري إلى بتاته الأربعة، مستقلًا عن الأرقام المجاورة.

d    e    a    d
1101 1110 1010 1101   # كل رقم ست عشري نِبل مستقل

والثماني يعمل بالطريقة نفسها بثلاثة بتات للرقم، لأن 8 هو 2 أُس 3 — ولهذا كانت أذونات يونكس ثمانية: ثلاثة بتات أذونات لكل فئة مستخدمين تسع رقمًا واحدًا بالضبط. أما العشري فلا علاقة له من هذا النوع بالثنائي، ولذلك يتطلب التحويل بينهما قسمة حقيقية لا بحثًا في جدول.

ولهذا أيضًا يُجمَّع الحقل الثنائي هنا في رباعيات والحقل الست عشري في أزواج: فالمجموعات تنطبق على الحدود التي تهم، فتقرأ نِبلًا أو بايتًا من الشاشة دون عدّ.

الأعداد السالبة والمتمّم الثنائي

ليس للعدد السالب صورة ثنائية بذاته. فلا إشارة سالب في السجل — بتات فقط — ومن ثم يجب ترميز الإشارة في البتات نفسها، وهذا يستلزم تحديد عدد البتات. ولهذا وُجد مُحدِّد العرض، ولهذا يتغير الجواب حين تغيّره.

والأسلوب الذي تستعمله كل آلة حديثة هو المتمّم الثنائي: لتمثيل عدد سالب تأخذ صورته الموجبة، وتعكس كل بت، وتضيف واحدًا. والنتيجة أن البت الأعلى ينتهي إلى معنى «سالب»، ويظل الجمع العادي يعمل دون حالة خاصة للإشارات.

0000 0101   # 5
1111 1010   # كل بت معكوس
1111 1011   # زائد واحد: ‎-5‎ كبايت، أو fb بالست عشري

ووسّع السجل فيأخذ العدد نفسه نمطًا آخر: ‎-5‎ هو fb في 8 بتات، وfffb في 16، وfffffffb في 32. لم تتغير القيمة؛ بل تغير عدد البتات الحاملة لها. وتبديل العرض في هذه الأداة يُظهر ذلك بالضبط.

لماذا 0xFF هو 255 و‎-1‎ في آنٍ واحد

البتات ff لا تقول إن كانت ذات إشارة. فالبايت الحامل 1111 1111 يُقرأ 255 إن كانت الشيفرة المحمّلة له قد صرّحت بنوع بلا إشارة، ويُقرأ ‎-1‎ إن صرّحت بنوع ذي إشارة. ولا شيء في البايت نفسه يفرّق بينهما — فالنوع دعوى يطلقها البرنامج على بتات لا تحمل تلك المعلومة.

ومن هنا تنشأ عائلة كاملة من العلل الحقيقية: مجموع تحقق يخرج سالبًا، وبايت مقروء من ملف يُقارَن على أنه أصغر من صفر، وchar في C يسلك على ARM غير سلوكه على x86 لأن كونه ذا إشارة متروك للتنفيذ. وكلما اختلفت القراءتان ذات الإشارة وبلا إشارة، عرضت هذه الأداة كلتيهما، لأن هذا التباين هو غالبًا ما كنت تبحث عنه.

شبكة البتات

يُعرض كل بت من القيمة الحالية مع رقم موضعه، والنقر عليه يقلبه. وتتحدث الأنظمة فورًا، مما يجعل أسئلة عدة أيسر كثيرًا من الإجابة عنها يدويًا:

  • أي بت مضبوط في قيمة الرايات هذه — انقرها واقرأ المواضع.
  • ما القناع اللازم للبتين 4 و7 — اضبط هذين واقرأ الست عشري.
  • ماذا يفعل ضبط البت الأعلى بقيمة ذات إشارة — يجعلها سالبة على نحو مرئي.
  • هل هذه القيمة قوة للعدد اثنين — فقوة الاثنين فيها بت واحد مضبوط بالضبط.

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

الأعداد الكبيرة تبقى دقيقة

أعداد JavaScript هي doubles، ولا تحفظ الصحيحة بدقة إلا حتى 2^53 — نحو 9 كوادرليون. وقيمة 64 بتًا قد تتجاوز ذلك، ومحوّل مبني على الأعداد العادية سيقرّبها بصمت، فيعطي سلسلة ست عشرية تبدو معقولة وهي خاطئة في أرقامها الأخيرة.

وهنا يستعمل كل شيء أعدادًا صحيحة ذات دقة غير محدودة، فتُحوَّل قيمة 64 بتًا كاملة بدقة. ويمضي وضع الدقة غير المحدودة أبعد فيرفع الحد كليًا — وهو مفيد للقيم التعمياتية والمعرّفات الكبيرة — لكن انتبه إلى أنه بلا عرض ثابت لا وجود للمتمّم الثنائي، فيحمل العدد السالب في ذلك الوضع إشارة سالب في كل أساس فحسب.

الأسئلة الشائعة

لماذا يظهر ‎-5‎ على هيئة fb لا ‎-101‎ في الثنائي؟
لأن السجل لا يملك إشارة سالب. فمع اختيار عرض، تُعرض الأعداد السالبة بالمتمّم الثنائي، وهو ما تخزّنه الآلة فعلًا: ‎-5‎ في بايت هو 1111 1011، أي fb. وإن أردت الصورة الرياضية بإشارة، فبدّل العرض إلى الدقة غير المحدودة.
هل 0xFF يساوي 255 أم ‎-1‎؟
كلاهما — فالبتات متطابقة ولا يفصل إلا النوع المصرَّح به. فقيمة 8 بتات ذات إشارة تقرأ ff على أنه ‎-1‎، وبلا إشارة تقرؤه 255. وكلما اختلفت القراءتان عرضتهما الأداة جنبًا إلى جنب.
لماذا يُستعمل الست عشري كثيرًا بدل العشري؟
لأن رقمًا ست عشريًا واحدًا هو أربعة بتات بالضبط، فيتحول الست عشري والثنائي بالبحث دون حساب، وتنطبق الأرقام على حدود البايتات. أما العشري فلا تربطه هذه العلاقة بالثنائي، ولذلك لا تخبرك قيمة عشرية بشيء عن البتات المضبوطة.
ما أعلى أساس هنا، ولماذا 36؟
‏36، لأنها 10 أرقام و26 حرفًا — كل رمز تقدمه الأبجدية اللاتينية البسيطة. والصعود فوق ذلك يستلزم عرفًا حول الرموز الإضافية التي تُستعمل، ولا يوجد عرف متفق عليه.
هل يمكنني لصق قيمة فيها 0x أو مسافات؟
نعم. تُقبل البادئات 0x و0b و0o في أساسها المقابل، وتُتجاهل المسافات والشرطات السفلية، فيمكنك اللصق مباشرة من شيفرة أو ورقة بيانات دون تنظيف مسبق.
هل تُحوَّل قيمة 64 بتًا بدقة؟
نعم. كل الحساب يستعمل أعدادًا صحيحة ذات دقة غير محدودة، فتبقى القيم فوق 2^53 — حيث يبدأ عدد JavaScript العادي بالتقريب — دقيقة.
هل يُرسَل أي شيء أكتبه إلى خادم؟
لا. إنه حساب يجري في متصفحك؛ لا يُرفع شيء ولا يُسجَّل، ويعمل دون اتصال بالشبكة.