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

من موسوعة حسوب
اذهب إلى: تصفح، ابحث

تحوّل هذه الخوارزمية العدد المعطى من النظام العشري (الأساس 10) إلى النظام السداسي عشر hexadecimal (الأساس 16).

يستخدم النظام السداسي عشر 16 رمزًا لتمثيل الأعداد، تستخدم الأرقام ‎0-9 لتمثيل نفسها، أما الأرقام ‎10-15 فتمثّل بواسطة الحروف A-F.

مثال:

Input : 116
Output : 74

Input : 10
Output : A

Input: 33
Output: 21

خطوات الخوارزمية

  1. يخزّن باقي قسمة العدد المعطى على 16 في متغير مؤقت (ليكن temp). إن كانت قيمة temp أقل من 10 يضاف المقدار ‎(48 + temp)‎ في مصفوفة الحروف، وإن كانت قيمة temp أكبر من 10 أو تساويها، فيضاف المقدار ‎(55 + temp)‎ في مصفوفة الحروف.
  2. يقسم ناتج القسمة من الخطوة السابقة على العدد 16 مرة أخرى.
  3. تكرّر الخطوتان السابقتان إلى حين الوصول إلى الرقم 0.
  4. تطبع المصفوفة الناتجة بترتيب معكوس.

لو أردنا تحويل العدد 2545 مثلًا إلى النظام السداسي عشر:

  1. باقي قسمة العدد 2545 على 16 هو 1؛ لذا فإنّ temp = 1؛ ولمّا كانت قيمة المتغير temp أصغر من 10 فإنّ ‎arr[0] = 48 + 1 = 49 = '1'‎.
  2. يقسّم العدد 2545 على 16 وبهذا يصبح الرقم الجديد هو ناتج القسمة 2545/16 = 159.
  3. باقي قسمة العدد 159 على 16 هو 15؛ لذا فإنّ temp = 15؛ ولمّا كانت قيمة المتغير temp أكبر من 10 فإنّ ‎arr[1] = 15 + 55 = 70 = 'F'‎.
  4. يقسّم العدد 159 على 16 وبهذا يصبح الرقم الجديد هو ناتج القسمة 159/16 = 9.
  5. باقي قسمة العدد 9 على 16 هو 9؛ لذا فإنّ temp = 9؛ ولمّا كانت قيمة المتغير temp أصغر من 10 فإنّ ‎arr[3] = 48 + 9 = 57 = '9'‎.
  6. يقسّم العدد 2545 على 16 وبهذا يصبح الرقم الجديد هو ناتج القسمة 2545/16 = 159.
  7. وصلت الخوارزمية إلى الصفر؛ لذا تطبع المصفوفة الناتجة بترتيب معكوس، والنتيجة هي العدد السداسي عشر المكافئ للعدد العشري المعطى.

تنفيذ الخوارزمية

تعرض الأمثلة التالية طريقة تنفيذ الخوارزمية في عدد من لغات البرمجة:

  • 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); 
	} 
}

مصادر