محوّل أنظمة العد
يحوّل عددًا بين الثنائي والثماني والعشري والست عشري وأي أساس من 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 بتًا كاملة بدقة. ويمضي وضع الدقة غير المحدودة أبعد فيرفع الحد كليًا — وهو مفيد للقيم التعمياتية والمعرّفات الكبيرة — لكن انتبه إلى أنه بلا عرض ثابت لا وجود للمتمّم الثنائي، فيحمل العدد السالب في ذلك الوضع إشارة سالب في كل أساس فحسب.
من الثنائي إلى العشري، ومن العشري إلى الثنائي
الثنائي والعشري هما الزوج الوحيد هنا الذي لا تجمع بينهما صلة: فالاثنان ليسا قوة للعشرة، والعشرة ليست قوة للاثنين، ولذلك ليس أي من الاتجاهين بحثًا في جدول، وكلاهما يتطلب حسابًا حقيقيًا. وهما كذلك ليسا الحساب نفسه، وهذا هو الجزء الذي نادرًا ما يُقال صراحة — فالطريقة اليدوية السريعة في اتجاه ليست عكس الطريقة اليدوية السريعة في العودة.
- من الثنائي إلى العشري بالمضاعفة: ابدأ من أقصى اليسار بصفر، ثم مع كل بت ضاعف ما لديك وأضف ذلك البت. فمع 1011 يمضي 1، ثم 2، ثم 5، ثم 11 — مرور واحد بلا قيم مواضع تُحفظ، وهو بالضبط ما تفعله هذه الأداة حين تقرأ ما تكتبه.
- من الثنائي إلى العشري بالمواضع: اجمع قيمة موضع كل بت مضبوط، وهو المثال المشروح أعلاه. أسرع حين يكون بتان أو ثلاثة مضبوطة فقط، وأبطأ حين يكون أكثرها مضبوطًا.
- من العشري إلى الثنائي بالقسمة: اقسم على اثنين واكتب الباقي، مرة بعد مرة، حتى لا يبقى شيء — ثم اقرأ البواقي من الأسفل إلى الأعلى. فالجواب يصل بالبت الأدنى أهمية أولًا، ولهذا يبدو مقلوبًا طوال كتابتك له.
- من العشري إلى الثنائي بالطرح: اطرح أكبر قوة للاثنين تتسع، وكرر. فالعدد 200 يفقد 128 فيبقى 72، و72 يفقد 64 فيبقى 8، و8 يفقد 8 فلا يبقى شيء — فتكون البتات في المواضع 7 و6 و3 مضبوطة والبايت هو 1100 1000. وهو أسرع من القسمة كلما كانت البتات المضبوطة قليلة.
وثمة أمر لا تغطيه أي طريقة يدوية هنا: العدد العشري السالب لا صورة ثنائية له البتة حتى يُختار عرض. اطلب سالب خمسة بالثنائي فيكون الجواب الأمين سؤالًا — كم بتًا؟ — وهو ما يحسمه مُحدِّد العرض وما يدور حوله القسم الخاص بالمتمّم الثنائي أعلاه. وفي وضع الدقة غير المحدودة لا عرض، فتأتي إشارة السالب معه إلى كل أساس ببساطة.
من العشري إلى الست عشري، ومن الست عشري إلى العشري
يكاد لا أحد ممن يفعلون هذا كثيرًا يقسم على ستة عشر. فعلاقة الست عشري بالثنائي هي الاختصار: حوّل العدد العشري إلى ثنائي مرة واحدة، واقطع البتات مجموعات من أربعة من جهة اليمين، واقرأ كل مجموعة رقمًا ست عشريًا واحدًا. والعودة هي المسار نفسه معكوسًا — مدّد كل رقم ست عشري إلى بتاته الأربعة، ثم اجمع قيم مواضع البتات المضبوطة. وحتى حجم بايت ثمة طريق أقصر: الرقم الست عشري الأول يساوي ستة عشر ضعف الثاني، فاضرب واجمع.
- 255 هو ff — بايت كل بتاته مضبوطة. وهو الأجدر بالحفظ، لأنه حيث يتوقف البايت.
- 256 هو 100. فبعد بايت كامل بخطوة واحدة تنقلب الأرقام، تمامًا كما ينقلب 99 إلى 100 بالعشري، ويكسب العدد الست عشري رقمًا لا يسع البايت حمله.
- 65535 هو ffff و65536 هو 10000: العلامتان نفسهما بعد بايت آخر، وعندهما يتوقف عدّاد من ست عشرة بتًا.
- 4096 هو 1000، ولهذا تبدو أحجام الصفحات والمحاذاة والإزاحات في الذاكرة مستديرة بالست عشري ومتعرجة بالعشري. فالست عشري يعدّ برباعيات من البتات، وكذلك يفعل العتاد.
وحالة الحرف لا تهم: FF وff القيمة نفسها، وتقبل الأداة الصورتين عند الإدخال وتطبع الحروف الصغيرة عند الإخراج. أما ما لن تفعله فهو التخمين. فالبادئة 0x تخص الحقل الست عشري وتُرفض في الحقل العشري بدل أن تُسقَط بصمت، لأن قيمة تُقرأ بالأساس الخطأ هي الخطأ الوحيد الذي لا يجوز لمحوّل أن يجعله يبدو معقولًا.
من الثماني إلى العشري، والصفر البادئ الذي يغيّر الجواب
يبقى الثماني في موضع واحد أكثر من أي موضع آخر: أذونات الملفات، حيث تسع ثلاثة بتات أذونات لكل فئة مستخدمين رقمًا ثمانيًا واحدًا بالضبط. وتحويله إلى العشري حساب مواضع بسيط بقوى الثمانية — فالعدد 755 بالثماني هو سبعة في أربعة وستين زائد خمسة في ثمانية زائد خمسة، أي 493 — والاتجاه المقابل قسمة على ثمانية مع بواقٍ تُقرأ من الأسفل إلى الأعلى، وهي الصورة نفسها التي في التحويل من العشري إلى الثنائي وللسبب نفسه: فالثمانية أيضًا لا علاقة لها بالعشرة.
- 755 هو 493 بالعشري، و644 هو 420، و777 هو 511. ولا واحد من هذه الأعداد العشرية يفيد أحدًا، وهذا هو المقصود — فالأذونات تُكتب بالثماني لأن الأرقام تنطبق على بتات الأذونات، لا لأن القيمة تعدّ شيئًا.
- والصفر البادئ علامة أساس في لغة C وفي Python 2، حيث 0755 ثماني ومن ثم هو العدد 493. أما Python 3 فترفض هذه الكتابة رفضًا تامًا وتريد 0o755 بدلًا منها، وهو ما أزال عائلة كاملة من العلل الصامتة.
- ويقرأ YAML 1.1 كذلك 0755 غير المقتبس على أنه 493، ولهذا يجب اقتباس وضع الأذونات في ملف إعدادات وإلا كفّ عن أن يكون الوضع الذي كتبته.
- ولم يسمح JSON بذلك قط. فقواعده تمنع الصفر البادئ في العدد، ومن ثم فإن 0755 ليس عددًا هناك أصلًا بل خطأ تحليل — وهو أعلى السلوكيات الثلاثة صوتًا، والوحيد الذي يستحيل أن يُقرأ خطأ.
وهذه الأداة لا ترى في الصفر البادئ علامة على شيء. فالحقل الذي تكتب فيه هو ما يحدد الأساس، ومن ثم فإن 0755 في الحقل العشري هو 755 وفي الحقل الثماني هو 493، والبادئة 0o مقبولة في الحقل الثماني ومرفوضة في كل ما عداه. وتخمين الأساس من بادئة يعني إعادة عدد غير الذي كُتب.
من الثماني إلى الست عشري: الزوج الذي لا اختصار له
كلاهما قوة للاثنين، ومن ثم فكلاهما إعادة تجميع للبتات نفسها — ومع ذلك فهذا هو الزوج الوحيد بين الأسس الأربعة الذي لا توجد فيه قاعدة تقابل رقمًا برقم. فالرقم الثماني الواحد ثلاثة بتات، والرقم الست عشري الواحد أربعة، ولا يقبل أي منهما القسمة على الآخر، فلا تنطبق الحدود أبدًا. ولا سبيل إلى تجاوز كتابة البتات وإعادة تجميعها.
- اكتب كل رقم ثماني ببتاته الثلاثة بالترتيب: فيصير 755 هو 111 101 101.
- أعد تجميع تلك البتات رباعيات من الطرف الأيمن، مع حشو اليسار بأصفار حين لا تنقسم العدة بالتساوي: 0001 1110 1101.
- اقرأ كل مجموعة من أربعة رقمًا ست عشريًا واحدًا: 1ed. والحشو في الطرف الخطأ هو الغلط الكلاسيكي هنا، وهو لا يبدو غلطًا — إنما يضاعف الجواب بصمت.
وكون رقمين ست عشريين بايتًا واحدًا بالضبط، وكون رقمين ثمانيين ليسا كذلك، هو كل سبب إزاحة الست عشري للثماني في قراءة الذاكرة: فثمانية بتات هي رقمان ثمانيان وثلثان، ومن ثم يقع حد البايت في منتصف رقم. لقد ناسب الثماني آلات كان حجم كلمتها مضاعفًا لثلاثة بتات؛ ويناسب الست عشري بايت الثمانية بتات. وفي هذه الصفحة شبكة البتات أسرع من الطريقتين اليدويتين معًا لهذا الزوج — اضبط البتات مرة واحدة فيكون الحقلان يعرضان الجواب أصلًا.
الأسئلة الشائعة
- لماذا يظهر -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 العادي بالتقريب — دقيقة.
- هل يُرسَل أي شيء أكتبه إلى خادم؟
- لا. إنه حساب يجري في متصفحك؛ لا يُرفع شيء ولا يُسجَّل، ويعمل دون اتصال بالشبكة.
- كيف أحوّل الثنائي إلى العشري يدويًا؟
- بالمضاعفة والجمع من اليسار: ابدأ بصفر، ومع كل بت ضاعف ما لديك حتى الآن وأضف البت. فالعدد 1011 يمضي 1، ثم 2، ثم 5، ثم 11. وهو مرور واحد بلا قيم مواضع تُحفظ، وتعمل الطريقة نفسها في أي أساس — اضرب في الأساس بدل المضاعفة.
- كم يساوي 255 بالست عشري، ولماذا يتكرر هذا العدد؟
- ff. فهو بايت بكل بتاته الثمانية مضبوطة، ومن ثم هو أكبر قيمة يحملها بايت واحد والنقطة التي تنقلب عندها العدة إلى بايت ثانٍ — ولهذا يظهر في قنوات الألوان والأقنعة وحدود الأحجام في كل مكان. وأكثر منه بواحد هو 256، ويُكتب 100 بالست عشري.
- هل 0755 هو العدد نفسه 755؟
- هنا نعم في الحقل العشري ولا في الحقل الثماني: فالحقل يحدد الأساس، والصفر البادئ مجرد رقم صفر. أما في غير ذلك فيتوقف على اللغة — فلغة C وPython 2 تقرآن 0755 ثمانيًا، أي 493؛ وPython 3 ترفض الكتابة وتريد 0o755؛ ويقرؤه YAML 1.1 على أنه 493؛ ويعامله JSON خطأ نحويًا.
- كيف أحوّل الثماني إلى الست عشري؟
- عبر الثنائي، إذ لا طريق أقصر: ثلاثة بتات لكل رقم ثماني، وأربعة لكل رقم ست عشري، ولا ينطبق الاثنان أبدًا. مدّد كل رقم ثماني إلى بتاته الثلاثة، وأعد تجميع السلسلة كلها رباعيات ابتداءً من اليمين، واقرأ كل رباعية رقمًا ست عشريًا — فيصير 755 هو 111 101 101، ثم 0001 1110 1101، ثم 1ed.
أدوات ذات صلة
- محوّل أحجام البيانات
العدد نفسه مقروءًا بوصفه كمية تخزين لا نمط بتات: تلك الصفحة تحوّل عدد البايتات إلى وحدات عشرية وثنائية جنبًا إلى جنب، وتقول أين يختلف النظامان.
- حاسبة النسبة المئوية
الأساس يقول كيف يُكتب العدد، والنسبة المئوية تقول كم يبلغ إلى جانب عدد آخر. تلك الصفحة تحسب الحصص والتغيّرات والعمليات العكسية، وتكتب المعادلة بأرقامك أنت.