تحويل الأعداد من النظام العشري إلى النظام السداسي عشر
تحوّل هذه الخوارزمية العدد المعطى من النظام العشري (الأساس 10) إلى النظام السداسي عشر hexadecimal (الأساس 16).
يستخدم النظام السداسي عشر 16 رمزًا لتمثيل الأعداد، تستخدم الأرقام 0-9
لتمثيل نفسها، أما الأرقام 10-15
فتمثّل بواسطة الحروف A-F
.
مثال:
Input : 116
Output : 74
Input : 10
Output : A
Input: 33
Output: 21
خطوات الخوارزمية
- يخزّن باقي قسمة العدد المعطى على
16
في متغير مؤقت (ليكنtemp
). إن كانت قيمةtemp
أقل من10
يضاف المقدار(48 + temp)
في مصفوفة الحروف، وإن كانت قيمةtemp
أكبر من10
أو تساويها، فيضاف المقدار(55 + temp)
في مصفوفة الحروف. - يقسم ناتج القسمة من الخطوة السابقة على العدد
16
مرة أخرى. - تكرّر الخطوتان السابقتان إلى حين الوصول إلى الرقم
0
. - تطبع المصفوفة الناتجة بترتيب معكوس.
لو أردنا تحويل العدد 2545
مثلًا إلى النظام السداسي عشر:
- باقي قسمة العدد
2545
على16
هو1
؛ لذا فإنّtemp = 1
؛ ولمّا كانت قيمة المتغيرtemp
أصغر من10
فإنّ arr[0] = 48 + 1 = 49 = '1'
. - يقسّم العدد
2545
على16
وبهذا يصبح الرقم الجديد هو ناتج القسمة2545/16 = 159
. - باقي قسمة العدد
159
على16
هو15
؛ لذا فإنّtemp = 15
؛ ولمّا كانت قيمة المتغيرtemp
أكبر من10
فإنّ arr[1] = 15 + 55 = 70 = 'F'
. - يقسّم العدد
159
على16
وبهذا يصبح الرقم الجديد هو ناتج القسمة159/16 = 9
. - باقي قسمة العدد
9
على16
هو9
؛ لذا فإنّtemp = 9
؛ ولمّا كانت قيمة المتغيرtemp
أصغر من10
فإنّ arr[3] = 48 + 9 = 57 = '9'
. - يقسّم العدد
2545
على16
وبهذا يصبح الرقم الجديد هو ناتج القسمة2545/16 = 159
. - وصلت الخوارزمية إلى الصفر؛ لذا تطبع المصفوفة الناتجة بترتيب معكوس، والنتيجة هي العدد السداسي عشر المكافئ للعدد العشري المعطى.
تنفيذ الخوارزمية
تعرض الأمثلة التالية طريقة تنفيذ الخوارزمية في عدد من لغات البرمجة:
- C++:
#include<iostream>
using namespace std;
void decToHexa(int n)
{
// مصفوفة من الحروف تستخدم لتخزين العدد السداسي عشر
char hexaDeciNum[100];
// عداد لمصفوفة العدد السداسي عشر
int i = 0;
while(n!=0)
{
// متغير مؤقت لتخزين باقي القسمة
int temp = 0;
// تخزين باقي القسمة في المتغير المؤقت
temp = n % 16;
// التحقق ممّا إذا كانت قيمة المتغير المؤقت أقل من 10
if(temp < 10)
{
hexaDeciNum[i] = temp + 48;
i++;
}
else
{
hexaDeciNum[i] = temp + 55;
i++;
}
n = n/16;
}
// طباعة مصفوفة العدد السداسي عشر بترتيب معكوس
for(int j=i-1; j>=0; j--)
cout << hexaDeciNum[j];
}
// اختبار الدالة السابقة
int main()
{
int n = 2545;
decToHexa(n);
return 0;
}
- بايثون:
def decToHexa(n):
# قائمة من الحروف لتخزين العدد السداسي عشر
hexaDeciNum = ['0'] * 100;
# عداد لقائمة العدد السداسي عشر
i = 0;
while(n != 0):
# متغير مؤقت لتخزين باقي القسمة
temp = 0;
# تخزين باقي القسمة في المتغير المؤقت
temp = n % 16;
# التحقق ممّا إذا كانت قيمة المتغير المؤقت أقل من 10
if(temp < 10):
hexaDeciNum[i] = chr(temp + 48);
i = i + 1;
else:
hexaDeciNum[i] = chr(temp + 55);
i = i + 1;
n = int(n / 16);
# طباعة عناصر قائمة العدد السداسي عشر بترتيب معكوس
j = i - 1;
while(j >= 0):
print((hexaDeciNum[j]), end = "");
j = j - 1;
# اختبار الدالة السابقة
n = 2545;
decToHexa(n);
- جافا:
import java.io.*;
class GFG
{
static void decToHexa(int n)
{
// مصفوفة من الحروف تستخدم لتخزين العدد السداسي عشر
char[] hexaDeciNum = new char[100];
// عداد لمصفوفة العدد السداسي عشر
int i = 0;
while(n!=0)
{
// متغير مؤقت لتخزين باقي القسمة
int temp = 0;
// تخزين باقي القسمة في المتغير المؤقت
temp = n % 16;
// التحقق ممّا إذا كانت قيمة المتغير المؤقت أقل من 10
if(temp < 10)
{
hexaDeciNum[i] = (char)(temp + 48);
i++;
}
else
{
hexaDeciNum[i] = (char)(temp + 55);
i++;
}
n = n/16;
}
// طباعة عناصر قائمة العدد السداسي عشر بترتيب معكوس
for(int j=i-1; j>=0; j--)
System.out.print(hexaDeciNum[j]);
}
// اختبار التابع السابق
public static void main (String[] args)
{
int n = 2545;
decToHexa(n);
}
}
مصادر
- صفحة Program for decimal to hexadecimal conversion في توثيق الخوارزميات في موقع GeeksforGeeks.