أولا: الارقام بالـ binary و الـ hexadecimal و العلاقة بينهما
كما تعلمون (و بدون فلسفة زايدة) الكومبيوتر يتعامل مع الارقام على شكل اصفار و آحاد, 01000111 و يتبع في هذا نظاما للأرقام يختلف عن النظام اللذي نتبعه نحن البشر, فالرقم
10
بالنسبة لنا هو الرقم عشرة, لماذا؟ لانه مكون من خانتين, اول خانة هي خانة الاحاد, و قيمتها صفر, و ثاني خانة و هي خانة العشرات, و قيمتها واحد, اذا هناك صفر آحاد + واحد عشرات = صفر + عشرة = عشرة
بالنسبة للحاسوب, فالرقم
10
هو اثنان, لان النظام الثنائي يعتبر الخانة الأولى هي خانة الواحد, و الخانة الثانية هي خانة الاثنان, يمكن اعتبار ان 0 هو off او مغلق, و 1 هو on او مفتوح.
هنا خانة الواحد off, و خانة الاثنين هي on, يعني صفر + اثنان = اثنان.
ليس هذا المجال للاسهاب في شرح نظم الاعداد, لا بد من وجود العديد من المواضيع في هذا المنتدى او في اماكن مختلفة من الانترنت تتحدث عن هذا الموضوع.
ابسط طريقة لتحديد ما هي قيم رقم ثنائي, مثل
100101001
هي التفكير في ارقام الخانات على انها تحمل قيمة معينة, و لتحديد قيمة الرقم, نقوم باخذ جميع الخانات اللتي تحمل رقم 1, و نقوم باضافة قيم هذه الخانات الى بعضها.
في الارقام العشرية, فان الخانات مرتبة هكذا:
آحاد - عشرات - مئات - آلاف ... الخ
او, بنفس الطريقة, لو كتبناها على شكل ارقام:
واحد - عشرة - مئة - الف - عشرة الاف - مئة الف ... الخ
او
1 - 10 - 100 - 1000 - 10000 ... الخ
حيث كل خانة هي الخانة السابقة مضروية في عشرة, و ذلك لان النظام عشري!
في النظام الثنائي, فإن كل خانة هي الخانة السابقة مضروبة في 2:
1 - 2 - 4 - 8 - 16 - 32
مثلا, هذا الرقم:
100101001
يمكن تحليله هكذا:
1 0 0 1 0 1 0 0 1
-----------------------------------------------------------------------
256 125 64 32 16 8 4 2 1
لاخذ قيمة الرقم, ننظر الى الخانات اللتي تحمل رقم 1, و نجمع قيمها:
1 + 8 + 32 + 256 = 41 + 256 = 297
طيب,
كتابة الارقام و تذكرها على شكل ثنائي امر صعب و معقد بعض الشيء, لذلك معظم الناس يفضلون استخدام الظام الست عشري hexadecimal لكتابة الارقام الثنائية ..
النظام الست عشري, يبدا من 0 ..9 ثم يستخدم الحروف f .. a من اجل تمثيل الارقام من 10 الى 15
اما الخانات فهي تتضاعف بمقدار 16 في كل خانة
الجميل في هذا النظام, هي امكانية تحويل الارقام من النظام binary الى النظام hexadecimal مباشرة دون حسابات معقدة, و ذلك عن طريق اخذ كل 4 خانات (بتات) و تحويلها على حدة,
مثلا,
1100
هو الرقم 12, و بالـ hex هو C
اذا, 1100 تتحول الى C
و الرقم
0110
هو الرقم 6, و بالـ hex هو ايضا 6
اذا, يمكن تحويل الرقم
11000110
الى
C6
و ذلك لانه يمكن تحويل كل 4 خانات على حدة,
11000110
/ \
/ \
/ \
1100 0110
| |
| |
| |
| |
C 6
\ /
\ /
\ /
\ /
C6
كل ما عليك معرفته, هو كيفية تحويل رقم ثنائي ذو اربع خانات الى رقم عشري (او ست عشري)
و هذا بسيط, فخانات الرقم الثنائي هي: 1 2 4 8
يعني, 1100 هي 12 لأن ثالث و رابع بت هما 8 و 4 و هما الوحيدان اللذان يحملان الرقم 1, لذلك نجمعهما للحصول على الرقم.
مثلا, الرقم الست عشري
F03C
هو:
1111000000111100
حيث:
F 0 3 C
| | | |
| | | |
| | | |
1111 0000 0011 1100
ما دفعني لكتابة هذا الموضوع هو سؤال الاخ الشمري عن الـ bit patterns في موضوع سابق, و حينها اجبت اجابة مقتضبة نوعا ما, و كنت اقرأها قبل قليل و شعرت بأن اجابتي غير شافية, ففكرت في كتابة موضوع خاص عن الموضوع.
هناك مواضيع أخرى من هذا القبيل اود التحدث عنها إن شاء الله:
- عمليات الـ bit masking, و هي متعلقة بهذا الموضوع.
- حساب احداثيات الـ pixels على الشاشة, او التحويل بين index احادي الابعاد و index ثنائي الابعاد .. حيث ان الشاشة بالنسبة لنا مربعة, و كل بكسل له احداثيين, سيني و صادي, و لكن بالنسبة للحاسوب, الشاشة عبارة عن linear frame buffer, او سلسلة خطية من النقاط.
انا متأكد انه من يقرأ هذا الموضوع ستظل عنده اسئلة عالقة بدماغه, فيا ريت اللي عنده سؤال يسأل! (مللت من تكرار هذه الجملة دون فائدة).
يا جماعة لو حد معبر الموضوع ده من أصله خلي يسأل!!!