FlowingDev

ما وراء الأساس 10: كيف تعدّ الحواسيب بالنظام الست عشري، الثنائي، والثماني

تعلم كيف تستخدم الحواسيب أنظمة العد مثل النظام الثنائي (أساس-2)، والست عشري (أساس-16)، والثماني لتمثيل كل شيء من الألوان إلى عناوين الشبكة.

جرّب الأداة: Base Calculator

في جملة واحدة

حاسبة أنظمة العد تترجم الأرقام بين أنظمة عد مختلفة، مثل النظام العشري المألوف (أساس-10) الذي نستخدمه يوميًا والنظام الثنائي (أساس-2) الذي تقوم عليه كل الدوائر المنطقية الرقمية.

المشكلة التي تحلها

البشر مهووسون بالرقم عشرة. لدينا عشرة أصابع في أيدينا وعشرة في أقدامنا، لذا فإن العد في مجموعات من عشرة (النظام العشري أو أساس-10) يبدو طبيعيًا مثل التنفس. لكن الحواسيب؟ إنها أبسط قليلاً. في جوهرها، تفهم شيئين فقط: "تشغيل" و "إيقاف". إما أن يكون هناك تيار يمر، أو لا. ترانزستور يعمل، أو لا يعمل. هذا هو عالم النظام الثنائي، أو أساس-2. كل معلومة في الحاسوب — هذا النص، فيديو القطط المفضل لديك، نظام التشغيل نفسه — هي مجرد سلسلة طويلة بشكل لا يمكن تصوره من الأصفار والآحاد.

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

للحفاظ على صحتهم العقلية (وجباههم)، طوروا اختصارات. أدركوا أنه يمكنهم تجميع البتات معًا. تجميعها في مجموعات من ثلاثة أعطاهم النظام الثماني (أساس-8)، وتجميعها في مجموعات من أربعة أعطاهم النظام الست عشري (أساس-16، أو hex). فجأة، سلسلة ثنائية طويلة مثل 1011001011111110 يمكن كتابتها بالشكل الأكثر إيجازًا في النظام الست عشري B2FE.

توجد حاسبة أنظمة العد لحل مشكلة الترجمة الأساسية هذه. إنها الدبلوماسي العالمي بين عالم الأساس-10 للفكر البشري وعوالم الأساس-2، -8، و -16 التي تعيش فيها خوادمنا المصنوعة من السيليكون.

كيف تعمل من الداخل

السحر وراء التبديل بين أنظمة العد ليس سحراً على الإطلاق — إنه مجرد نظام للعد يسمى الترميز الموضعي.

ما هو "الأساس" على أي حال؟

في أي نظام عد، يحدد موضع الرقم قيمته. نحن نأخذ هذا كأمر مسلم به في الأساس-10. في الرقم 345، نعرف بشكل بديهي أنه يعني "ثلاث مئات، وأربع عشرات، وخمس آحاد".

رياضياً، هذا هو: (3 * 10^2) + (4 * 10^1) + (5 * 10^0) = (3 * 100) + (4 * 10) + (5 * 1) = 300 + 40 + 5 = 345

"الأساس" هو الرقم الذي ترفعه إلى قوة لكل موضع (في هذه الحالة، 10). نفس القاعدة تنطبق على أي أساس.

في النظام الثنائي (أساس-2)، لدينا رقمان فقط: 0 و 1. الرقم 1011 في النظام الثنائي هو: (1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (1 * 2^0) = (1 * 8) + (0 * 4) + (1 * 2) + (1 * 1) = 8 + 0 + 2 + 1 = 11 (بالنظام العشري)

النظام الست عشري (أساس-16) أغرب قليلاً لأننا نحتاج إلى 16 "رقمًا" فريدًا. نستخدم 0-9 للعشرة الأولى، ثم نستعير الحروف A-F للقيم 10-15.

العشري الست عشري (Hex) الثنائي (Binary)
0 0 0000
1 1 0001
... ... ...
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111

التحويل من العشري إلى أي أساس

للقيام بالعكس — من نظامنا العشري المألوف إلى أساس آخر — نستخدم القسمة المتكررة. لنحول 187 (عشري) إلى النظام الست عشري (أساس-16).

  1. قسمة 187 على 16: 187 / 16 = 11 والباقي 11. في النظام الست عشري، 11 هو B.
  2. قسمة الناتج (11) على 16: 11 / 16 = 0 والباقي 11. في النظام الست عشري، 11 هو B.
  3. اقرأ البواقي من الأسفل إلى الأعلى: BB.

إذًا، 187 في النظام العشري هو BB في النظام الست عشري.

العلاقة الخاصة: الثنائي، الثماني، والست عشري

هنا الاختصار الرائع الذي اكتشفه المبرمجون الأوائل. بما أن 8 = 2^3 و 16 = 2^4، يمكنك التحويل من النظام الثنائي إلى الثماني أو الست عشري دون المرور بالنظام العشري على الإطلاق. كل ما عليك فعله هو تجميع البتات!

خذ الرقم الثنائي 110101110100.

  • للتحويل إلى ست عشري (أساس-16): جمّع البتات في مجموعات من أربعة، بدءًا من اليمين. 1101 0111 0100 ثم، حوّل كل مجموعة: 1101 = D (13) 0111 = 7 0100 = 4 النتيجة: D74 في النظام الست عشري.

  • للتحويل إلى ثماني (أساس-8): جمّع البتات في مجموعات من ثلاثة، بدءًا من اليمين. 110 101 110 100 ثم، حوّل كل مجموعة: 110 = 6 101 = 5 110 = 6 100 = 4 النتيجة: 6564 في النظام الثماني.

لهذا السبب، يحظى النظامان الست عشري والثماني بشعبية كبيرة. إنهما تمثيلان مدمجان وقابلان للقراءة البشرية للبيانات الثنائية الخام.

عمليات البت (Bitwise Operations)

حاسبة المبرمجين تتجاوز مجرد التحويل الأساسي بين الأنظمة. إنها تؤدي أيضًا عمليات البت، التي تتلاعب بالآحاد والأصفار الفردية للتمثيل الثنائي للرقم.

  • AND (&): تُرجع 1 في كل موضع بت تكون فيه البتات المقابلة لكلا المعاملين هي 1. إنها رائعة لعمل "قناع" (masking) أو التحقق مما إذا كان بت معين في حالة "تشغيل". 1101 & 1011 = 1001
  • OR (|): تُرجع 1 في كل موضع بت تكون فيه البتات المقابلة لأي من المعاملين أو كليهما هي 1. مفيدة "لضبط" بت على وضع التشغيل. 1101 | 1011 = 1111
  • XOR (^): تُرجع 1 في كل موضع بت تكون فيه البتات المقابلة مختلفة. إنها طريقة مفيدة لتبديل حالة البتات. 1101 ^ 1011 = 0110
  • NOT (~): تقلب جميع البتات. ~1101 = 0010 (بافتراض أرقام 4 بت)
  • إزاحة البت (Bit Shifts) (<<, >>): تدفع جميع البتات إلى اليسار أو اليمين. الإزاحة إلى اليسار (<< 1) هي طريقة سريعة للضرب في 2؛ والإزاحة إلى اليمين (>> 1) هي طريقة سريعة للقسمة على 2.

قصص من الواقع

قضية نوع الملف الغامض

مطورة تتلقى بريدًا إلكترونيًا به مرفق اسمه data.bin. من المفترض أن يكون صورة، لكن حاسوبها ليس لديه أي فكرة عن كيفية فتحه. بدلاً من الاستسلام، تفتح الملف في عارض ست عشري (hex viewer). البايتات الأولى جدًا تقرأ 89 50 4E 47 0D 0A 1A 0A. لقد رأت مثل هذه الطلاسم من قبل. تضع أول أربعة بايتات، 89504E47، في محرك بحث. النتائج فورية: هذا هو "الرقم السحري" (magic number)، أو توقيع الملف، لصورة PNG. تعيد تسمية الملف إلى data.png، وفويلا، يُفتح ليكشف عن صورة رائعة لكلب شيبا إينو يرتدي قبعة.

الدرس: النظام الست عشري هو لغة البيانات الخام. فهمه يتيح لك تحديد وتصحيح أخطاء الملفات على مستواها الأساسي.

معضلة ألوان CSS

مطورة واجهة أمامية تكاد تقتلع شعرها. لقد حددت لونًا أحمر زاهيًا وجميلاً في ملف CSS الخاص بها: color: #FF0000;. لكن على الشاشة، اللون أحمر باهت قليلاً ومختلف. تستخدم أدوات المطور في المتصفح لفحص العنصر وتجد أن اللون المحسوب هو في الواقع #FE0000. باستخدام حاسبة أنظمة العد، تتأكد من أن FF هو 255 بالنظام العشري (أقصى قيمة لقناة لون)، بينما FE هو 254. الفرق صغير، لكنه موجود. تتتبع قيمة اللون رجوعًا عبر كود جافاسكريبت الخاص بها وتجد دالة كانت تحول رقمًا بفاصلة عائمة إلى عدد صحيح باستخدام Math.floor() بدلاً من Math.round(). قيمة مثل 254.99 كانت تصبح 254 (FE) بدلاً من 255 (FF). بعد إصلاح سريع، أصبح لونها الأحمر زاهيًا تمامًا.

الدرس: النظام الست عشري (Hex) هو لغة مشتركة لألوان الويب. القدرة على تحويل قيم hex وفهمها بسرعة أمر حاسم للتصميم الدقيق وتصحيح الأخطاء.

ضبط الأذونات على خادم لينكس

مسؤول أنظمة مبتدئ يحتاج إلى تأمين ملف إعدادات على خادم. يخبره المسؤول الأقدم، "اضبط الأذونات على rwx r-x ---." يعرف المبتدئ أن هذا يتوافق مع أذونات المالك والمجموعة والآخرين، لكنه نسي الأمر. يتذكر أن أذونات لينكس يمكن تمثيلها بالنظام الثماني. يقوم بتحليلها:

  • المالك: rwx (قراءة، كتابة، تنفيذ) = 4 + 2 + 1 = 7
  • المجموعة: r-x (قراءة، تنفيذ) = 4 + 0 + 1 = 5
  • الآخرون: --- (لا أذونات) = 0 + 0 + 0 = 0

يجمعهم معًا ليحصل على الرقم الثماني 750. يكتب بثقة chmod 750 config.yml ويحصل على إيماءة رضا من المسؤول الأقدم.

الدرس: يوفر النظام الثماني طريقة موجزة وقياسية لتمثيل أقنعة البت (bitmasks)، والتي هي شائعة في الأنظمة منخفضة المستوى مثل أذونات ملفات يونكس.

أخطاء ومزالق شائعة

  • نسيان البادئة: الرقم 10 يعني شيئًا مختلفًا تمامًا في النظام العشري، الثنائي، والست عشري. يستخدم الكود والتوثيق بادئات مثل 0x للست عشري (0x10 = 16)، و 0b للثنائي (0b10 = 2)، و 0o للثماني (0o10 = 8) لتجنب الغموض. كن دائمًا على دراية بالسياق.
  • الخلط بين الأحرف المتشابهة: عندما تكون متعبًا وتحدق في تفريغ ذاكرة (memory dump)، من السهل الخلط بين B و 8، أو D و 0. تحقق مرة أخرى من كتاباتك الست عشرية.
  • تجاهل الإشارة (Two's Complement): رقم 16-بت ممثل بـ 0xFFFF في النظام الست عشري يمكن أن يعني 65535 إذا كان عددًا صحيحًا غير مؤشر (unsigned). ولكن إذا كان عددًا صحيحًا مؤشرًا (signed) يستخدم نظام "المتمم الثنائي" الشائع، فإنه يمثل -1. معنى البتات يعتمد كليًا على كيفية تفسيرها.
  • مشاكل الـ Endianness: عندما يتم تخزين رقم متعدد البايتات مثل 0x1A2B3C4D في الذاكرة، يمكن أن يختلف ترتيب البايتات. أنظمة "Big-endian" تخزنه كـ 1A 2B 3C 4D. أنظمة "Little-endian" (مثل معظم أجهزة الكمبيوتر الحديثة) تخزنه كـ 4D 3C 2B 1A. هذا مصدر كلاسيكي للأخطاء في الشبكات وتحليل الملفات عندما يحاول نظامان بـ endianness مختلف التواصل.

لماذا يجب أن يكون على رادارك

يجب أن تفكر بأنظمة العد المختلفة كلما كنت تنظر تحت سطح التجريدات عالية المستوى. هذا يشمل:

  • تحليل حزم الشبكة (مثل عناوين MAC، وعناوين IPv6).
  • العمل مع تنسيقات الملفات أو تفريغات الذاكرة الخام.
  • التعامل مع مخرجات الـ hash (مثل SHA-256) والتي تظهر دائمًا تقريبًا بالنظام الست عشري.
  • الضبط الدقيق لألوان الويب أو الرسومات النقطية (bitmapped graphics).
  • كتابة كود حرج من حيث الأداء باستخدام عمليات البت.
  • تكوين إعدادات النظام منخفضة المستوى، مثل الأذونات أو سجلات الأجهزة (hardware registers).

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

تعمق أكثر

  • Positional notation على ويكيبيديا — الأساس الرياضي لجميع أنظمة العد.
  • Hexadecimal على ويكيبيديا — غوص عميق في الأساس-16، تاريخه، واستخداماته الشائعة.
  • Two's Complement على ويكيبيديا — الشرح النهائي لكيفية تمثيل الحواسيب للأرقام السالبة في النظام الثنائي.
  • JavaScript Bitwise Operators على MDN — دليل عملي لاستخدام عمليات البت في لغة شائعة.
  • List of file signatures على ويكيبيديا — مرجع مفيد للتعرف على الملفات من خلال "أرقامها السحرية"، والتي غالبًا ما يتم التعبير عنها بالنظام الست عشري.
  • Endianness على ويكيبيديا — تعلم لماذا ترتيب البايتات يهم أكثر مما تعتقد.

انتهينا من النظرية. حان وقت التطبيق — 100% في متصفحك.

جرّب الأداة: Base Calculator