في جملة واحدة
تحويل أساس الأرقام هو فن ترجمة رقم من نظام عد (مثل نظامنا العشري المألوف ذي العشرة أرقام) إلى نظام آخر (مثل النظام الثنائي الأصلي للكمبيوتر ذي الرقمين)، دون تغيير قيمته الفعلية.
المشكلة التي يحلها
البشر، في الغالب، يمتلكون عشرة أصابع. هذا "العتاد" البيولوجي جعل العد في مجموعات من عشرة — أي النظام العشري أو base-10 — أمراً طبيعياً للغاية. لدينا عشرة رموز فريدة (من 0 إلى 9)، وبمجرد أن نصل إلى تسعة، "نقلب العداد": نضيف رقمًا جديدًا إلى اليسار ونبدأ من جديد من الصفر. العشرة هي 10، والمئة هي 100، وهكذا. ولا أسهل.
أجهزة الكمبيوتر، من ناحية أخرى، لديها "أصابع" مختلفة. عتادها الأساسي هو الترانزستور، وهو مفتاح مجهري يمكن أن يكون إما on (يعمل) أو off (متوقف). هذا كل شيء. حالتان فقط. هذا يجعل نظامًا برمزين — الثنائي أو base-2 — اللغة الأم للكمبيوتر. الرمزان هما 0 (off) و 1 (on).
هذا يخلق مشكلة في الترجمة. بالنسبة للكمبيوتر، الرقم البشري 237 لا معنى له. يجب تمثيله كسلسلة من حالات التشغيل والإيقاف (ons and offs). نفس الرقم، 237، في النظام الثنائي هو 11101101.
بينما تتقن أجهزة الكمبيوتر النظام الثنائي، فإن البشر... لا. قراءة سلسلة طويلة من الآحاد والأصفار هي وصفة أكيدة للصداع وإجهاد العين. لسد هذه الفجوة، ابتكر المطورون اختصارات ملائمة: النظام الثماني (octal أو base-8) والنظام السداسي عشري (hexadecimal أو base-16). هذه الأنظمة التي تعتمد على "قوى العدد اثنين" يسهل تحويلها من وإلى النظام الثنائي، لكنها تضغط السلاسل الثنائية الطويلة إلى أجزاء أكثر قابلية للقراءة.
توجد أنظمة العد المختلفة لحل هذا التعارض الأساسي بين كيفية تفكير البشر في الأرقام وكيفية تخزين الآلات لها فعليًا. إنها بمثابة حجر رشيد الذي يسمح لنا بإلقاء نظرة خاطفة على عقل الآلة دون أن نضيع في بحر من الآحاد والأصفار.
كيف يعمل تحت الغطاء
السحر وراء أي نظام عد هو مفهوم يسمى الترميز الموضعي (positional notation). موضع الرقم يحدد قيمته. دعنا نحلل الأمر.
ما هو "الأساس" (base) على أي حال؟
فكر في عداد المسافات في سيارتك. عندما ينتقل الرقم في أقصى اليمين من 9 إلى 0، يزداد الرقم الذي على يساره بمقدار واحد. "خانة" كل رقم تمثل قوة من قوى العدد عشرة.
الرقم 427 في نظامنا العشري (base-10) اليومي يعني في الحقيقة:
4مئات (4 × 10²)2عشرات (2 × 10¹)7آحاد (7 × 10⁰)
اجمعهم: 400 + 20 + 7 = 427.
"الأساس" (base) هو ببساطة الرقم الذي نرفعه إلى قوة لكل موضع. بالنسبة للنظام العشري (base-10)، الأساس هو 10. بالنسبة للنظام الثنائي (base-2)، هو 2. بالنسبة للنظام السداسي عشري (base-16)، هو 16. الصيغة هي نفسها، يتغير فقط الأساس (b):
... + (digit × b²) + (digit × b¹) + (digit × b⁰)
من عالمنا (العشري) إلى عالمهم (أي نظام عد)
لنحول رقمنا العشري 427 إلى النظام الثنائي (base-2). الخوارزمية هي "القسمة المتكررة على أساس النظام المستهدف وتسجيل الباقي".
| القسمة | الناتج | الباقي |
|---|---|---|
| 427 ÷ 2 | 213 | 1 |
| 213 ÷ 2 | 106 | 1 |
| 106 ÷ 2 | 53 | 0 |
| 53 ÷ 2 | 26 | 1 |
| 26 ÷ 2 | 13 | 0 |
| 13 ÷ 2 | 6 | 1 |
| 6 ÷ 2 | 3 | 0 |
| 3 ÷ 2 | 1 | 1 |
| 1 ÷ 2 | 0 | 1 |
الآن، اقرأ البواقي من الأسفل إلى الأعلى.
إذًا، الرقم العشري 427 هو 110101011 بالنظام الثنائي.
هذه الطريقة تعمل مع أي أساس. لتحويل 427 إلى النظام السداسي عشري (base-16)، ما عليك سوى القسمة على 16. (ملاحظة: في النظام السداسي عشري، نحتاج إلى أكثر من 10 رموز، لذلك نستخدم A للرقم 10، B للرقم 11، ...، حتى F للرقم 15).
427 ÷ 16 = 26والباقي11(وهوBفي نظام hex).26 ÷ 16 = 1والباقي10(وهوAفي نظام hex).1 ÷ 16 = 0والباقي1.
قراءة البواقي من الأسفل للأعلى تعطينا 1AB. إذًا، الرقم العشري 427 هو 1AB بنظام hex.
من عالمهم (أي نظام عد) إلى عالمنا (العشري)
للسير في الاتجاه المعاكس، نستخدم صيغة الترميز الموضعي التي رأيناها سابقًا. لنحول الرقم الثنائي 110101011 مرة أخرى إلى النظام العشري. نضرب كل رقم في 2 مرفوعًا لقوة موضعه (بدءًا من 0 على اليمين).
1 * 2^8 = 256
+ 1 * 2^7 = 128
+ 0 * 2^6 = 0
+ 1 * 2^5 = 32
+ 0 * 2^4 = 0
+ 1 * 2^3 = 8
+ 0 * 2^2 = 0
+ 1 * 2^1 = 2
+ 1 * 2^0 = 1
----------------
Total = 427
نجحت! لنجربها مع 1AB بنظام hex:
1 * 16^2 = 256
+ A * 16^1 = (10 * 16) = 160
+ B * 16^0 = (11 * 1) = 11
-------------------------
Total = 427
تمام. نفس الرقم، لكن بأزياء مختلفة.
الاختصار الخاص بالـ Hex والـ Octal
إذًا لماذا نستخدم الـ hex والـ octal؟ لأنهما نظاما عد يعتمدان على "قوى العدد اثنين".
- النظام الثماني (Octal) هو base-8، و 8 = 2³. هذا يعني أن كل رقم ثماني واحد يقابل تمامًا مجموعة من ثلاثة أرقام ثنائية.
- النظام السداسي عشري (Hex) هو base-16، و 16 = 2⁴. هذا يعني أن كل رقم سداسي عشري واحد يقابل تمامًا مجموعة من أربعة أرقام ثنائية (تُسمى "nibble").
لنأخذ رقمًا ثنائيًا كبيرًا: 1101011101001111
لقراءته، يجب على الإنسان مسح كل رقم. ولكن لتحويله إلى hex، ما عليك سوى تقسيمه إلى مجموعات من أربعة أرقام من اليمين:
1101 | 0111 | 0100 | 1111
الآن، قم بتحويل كل مجموعة:
1101هو8+4+0+1 = 13، وهوD0111هو0+4+2+1 = 70100هو0+4+0+0 = 41111هو8+4+2+1 = 15، وهوF
إذًا، 1101011101001111 هو ببساطة D74F بنظام hex. أسهل للقراءة بما لا يقاس وأقل عرضة للخطأ. هذه ليست مجرد عملية حسابية؛ إنها نسخ مباشر. لهذا السبب يعشق المطورون النظام السداسي عشري: إنه الغلاف المثالي القابل للقراءة البشرية للبيانات الثنائية.
قصص من الواقع
قضية اللون الغامض
يتلقى مطور واجهات أمامية مبتدئ نموذجًا تصميميًا من مصمم واجهة المستخدم. اللون الأساسي للعلامة التجارية مُدرج كـ #E63946. يعرف المطور أن هذا ظل من ظلال اللون الأحمر، ولكن ما مقدار الأحمر؟ وماذا عن الألوان الأخرى؟ يضع كود الـ hex في أحد المحولات. E63946 هو في الواقع ثلاثة أرقام hex منفصلة: E6 للأحمر، 39 للأخضر، و 46 للأزرق.
E6في نظام hex تُحول إلى230في النظام العشري. حسنًا، إذًا هي كمية كبيرة من اللون الأحمر (من أصل 255 كحد أقصى).39في نظام hex تُحول إلى57في النظام العشري. القليل من اللون الأخضر.46في نظام hex تُحول إلى70في النظام العشري. القليل من اللون الأزرق.
بتحليل كود الـ hex، يفهم المطور تركيبة اللون. إنه ليس مجرد "أحمر"، بل "أحمر في الغالب، مع كمية صغيرة ومتشابهة من الأخضر والأزرق لجعله أقل حدة."
الدرس المستفاد: النظام السداسي عشري (Hexadecimal) هو لغة الألوان على الويب. فهمه يساعدك على تجاوز مجرد نسخ ولصق الأكواد والفهم الحقيقي للألوان التي تعمل بها.
لغز صلاحيات نظام الملفات
يحاول مدير أنظمة (sysadmin) تأمين سكربت تم رفعه حديثًا، deploy.sh، على خادم لينكس. يحتاج إلى أن يكون المالك قادرًا على قراءته وكتابته وتنفيذه، ولكن يجب أن تتمكن المجموعة والجميع من قراءته وتنفيذه فقط. لقد رأى الأمر chmod 755 deploy.sh مستخدمًا في كل مكان، لكنه كان دائمًا يتعامل معه كتعويذة سحرية.
هذه المرة، يبحث عن معناه. الرقم 755 هو رقم ثماني (octal). إنه يمثل ثلاث مجموعات من الصلاحيات: للمالك (Owner)، للمجموعة (Group)، وللآخرين (Others).
- صلاحية المالك هي
7. في النظام الثنائي،7هي111. - صلاحية المجموعة هي
5. في النظام الثنائي،5هي101. - صلاحية "الآخرين" هي
5. في النظام الثنائي،5هي101.
كل رقم ثنائي يتوافق مع صلاحية معينة: قراءة (r)، كتابة (w)، وتنفيذ (x).
111تعنيrwx(القراءة والكتابة والتنفيذ كلها ON).101تعنيr-x(القراءة والتنفيذ ON، الكتابة OFF).
إذًا، chmod 755 يضبط الصلاحيات على rwxr-xr-x، وهو بالضبط ما كان مطلوبًا. تم حل اللغز.
الدرس المستفاد: يوفر النظام الثماني (Octal) اختصارًا موجزًا للغاية لإدارة صلاحيات الملفات، والتي هي في الأساس مجموعة من الأعلام (bits) التي تكون إما في حالة تشغيل أو إيقاف.
خطأ قلب البتات (Bit-Flipping Bug)
مطور يبني نظامًا مضمنًا (embedded system) لثرموستات ذكي يحتاج إلى حفظ إعدادات الجهاز في جزء صغير من الذاكرة. لتوفير المساحة، يستخدم بايت واحد (8 بت) كـ "سجل أعلام" (flag register). يمثل كل بت إعدادًا معينًا: isHeating، isCooling، fanOn، hasWifiConnection، إلخ.
في أحد الأيام، تنهال عليه تقارير الأخطاء: "عندما أشغل المروحة، تعمل التدفئة أيضًا!" يُصاب المطور بالحيرة. الكود الخاص بتشغيل المروحة يبدو صحيحًا. ولكن عندما يفحص بايت الإعدادات في الذاكرة، يرى المشكلة. لنفترض أن المروحة هي البت الثاني (القيمة 2¹ = 2) والتدفئة هي البت الثالث (القيمة 2² = 4). كان من المفترض أن يضبط الكود البايت على ...010 (المروحة تعمل). بدلاً من ذلك، كان يضبطه على ...110 (المروحة تعمل والتدفئة تعمل). كانت القيمة العشرية ستكون 6 بدلاً من 2، وهو أمر غير واضح على الفور. لكن النظر إلى التمثيل الثنائي 00000110 جعل المشكلة واضحة تمامًا: كان يتم قلب بتّين بدلاً من واحد. عملية bitwise خاطئة كانت هي السبب.
الدرس المستفاد: بالنسبة للبرمجة منخفضة المستوى، أو تصحيح أخطاء الذاكرة، أو العمل مع سجلات العتاد، فإن التفكير بالنظام الثنائي ليس اختياريًا — إنه الطريقة الوحيدة لرؤية ما يحدث بالفعل.
أخطاء ومصائد شائعة
- نسيان البادئات. في العديد من لغات البرمجة (مثل C، Java، أو JavaScript)، الرقم الذي يبدأ بـ
0يُفسّر على أنه رقم ثماني.010ليس عشرة، بل ثمانية! والرقم الذي يبدأ بـ0xهو سداسي عشري.0x10هو ستة عشر. عدم معرفة هذا يمكن أن يؤدي إلى بعض الأخطاء البرمجية الغريبة حقًا. - الخلط بين
O/0وI/1. عندما تحدق في سلاسل طويلة من الأرقام السداسية عشرية أو الثنائية، من السهل أن تشرد عيناك وتخلط بين الحرفOوالصفر، أوIوالواحد. نظام hex لا يستخدمOأوI، ولكن قد تستخدمها تحويلات أنظمة أخرى، وهو خطأ كلاسيكي من نوع "الأصبع السمين" (fat-finger). - افتراض وجود معيار قياسي للأنظمة ذات الأساس الأكبر من 16. الأحرف المستخدمة في النظام الثنائي (0-1)، الثماني (0-7)، العشري (0-9)، والسداسي عشري (0-9, A-F) موحدة. ولكن ماذا عن نظام base-22 أو base-36؟ معظم الأنظمة تستخدم
0-9تليهاA-Z، لكن هذا ليس قانونًا عالميًا. تحقق دائمًا من مجموعة الأحرف (أو "الأبجدية") المستخدمة عند التعامل مع أنظمة أقل شيوعًا. - تجاهل حدود الأعداد الصحيحة (integer limits). رقم سداسي عشري 64-بت مثل
0x7FFFFFFFFFFFFFFFيمثل رقمًا هائلاً. إذا حاولت تحويله وتخزينه في متغير عدد صحيح (integer) قياسي 32-بت في برنامجك، فلن يتسع. سيؤدي هذا إلى "فيضان العدد الصحيح" (integer overflow)، حيث "يلتف" الرقم ليصبح قيمة سالبة أو يتسبب في إطلاق خطأ برمجي.
لماذا يجب أن تضعه في اعتبارك
حتى لو لم تكن مبرمج C منخفض المستوى، ستصطدم بأنظمة العد المختلفة باستمرار. يجب أن تفكر فيها كلما كنت:
- تختار لونًا في CSS أو من أداة تصميم (
#RRGGBB). - تتعامل مع قيم hash مثل مفاتيح API أو أرقام SHA لـ Git commits، والتي تكون دائمًا تقريبًا بنظام hex.
- تضبط الصلاحيات على خادم ويب (
chmod). - تعمل مع صيغ بيانات منخفضة المستوى، بروتوكولات شبكات، أو أي شيء يستخدم أقنعة البت (bitmasks) (على سبيل المثال، أعلام الميزات).
- تصادف أكواد أخطاء أو عناوين ذاكرة في مصحح الأخطاء (debugger).
- تحاول أن تفهم كيف تعمل أجهزة الكمبيوتر فعليًا. إنه مفهوم تأسيسي يزيل الغموض عن الكثير من السحر الرقمي.
تعمق أكثر
- Positional Notation (Wikipedia): الغوص الأكاديمي العميق في النظرية وراء جميع أنظمة العد.
- Hexadecimal (Wikipedia): نظرة عامة رائعة على النظام السداسي عشري (base-16)، تاريخه، واستخداماته الشائعة في الحوسبة.
- **MDN Web Docs:
<color>: دليل مطور الويب النهائي لقيم الألوان في CSS، بما في ذلك شرح وافٍ لترميز الـ hex (#RRGGBB). chmodmanual page: الدليل الرسمي لأمرchmodفي لينكس، والذي يفصل استخدام النظام الثماني لضبط صلاحيات الملفات.- Bitwise operations in JavaScript (MDN): دليل عملي يوضح كيفية إجراء المعالجات على مستوى البت (bit-level) في لغة عالية المستوى، وهو سيناريو شائع لتطبيق المعرفة بالنظام الثنائي (base-2).