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

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

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

مثال:

Input: Hexadecimal = 1AC
Output: Binary = 0654
توضيح:
    القيمة الثنائية المكافئة للعدد 1: 0001
    القيمة الثنائية المكافئة للعدد: 1010
    القيمة الثنائية المكافئة للعدد: 1100

    تجميع الأعداد الثنائي ثلاث ثلاث: 000 110 101 100

    القيمة الثمانية المكافئة للعدد 000: 0
    القيمة الثمانية المكافئة للعدد 110: 6
    القيمة الثمانية المكافئة للعدد 101: 5
    القيمة الثمانية المكافئة للعدد 100: 4

Input: Hexadecimal = 5D1F
Output: Octal = 56437

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

نظام الأعداد السداسي عشر هو نظام عددي موقعي positional numeral system يكون الجذر أو الأساس فيه هو 16 ويستخدم 16 رمزًا لتمثيل الأعداد.

أما نظام الأعداد الثماني فالجذر أو الأساس فيه هو 8 ويستخدم 8 رموز لتمثيل الأعداد، ويمكن تحويل الأعداد من النظام الثنائي إلى النظام الثنائي بتجميع الأعداد الثنائية في مجموعات متتالية تضمّ كل واحدة منها ثلاثة رموز (بدءًا من اليمين).

تجري عملية تحويل الأعداد من النظام السداسي عشر إلى النظام الثماني باتباع الخطوات التالية:

  1. إيجاد العدد الثنائي المكافئ لكل رقم في العدد السداسي عشر المعطى. وتُضاف أصفار إلى الجانب الأيسر إن كان أيٌّ من الأعداد الثنائي المكافئة أقصر من 4 بتات.
  2. تقسيم الأعداد الثنائي إلى مجموعات، تحتوي كل مجموعة منها على 3 بتات أو أعداد ويبدأ التقسيم من اليمين إلى اليسار. تضاف الأصفار إلى الجانب الأيسر إن كانت أي مجموعة تحتوي على أقلّ من 3 بتات.
  3. إيجاد العدد الثماني المكافئ لكل مجموعة من الأعداد الثنائية.

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

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

  • C++‎:
#include <math.h> 
#include <stdio.h> 
#include <string.h> 

long long int hex_to_bin(char hex[]) 
{ 
	long long int bin, place; 
	int i = 0, rem, val; 

	bin = 0ll; 
	place = 0ll; 

	// التحويل من النظام السداسي عشر إلى النظام الثنائي
	for (i = 0; hex[i] != '\0'; i++) { 
		bin = bin * place; 

		switch (hex[i]) { 
		case '0': 
			bin += 0; 
			break; 
		case '1': 
			bin += 1; 
			break; 
		case '2': 
			bin += 10; 
			break; 
		case '3': 
			bin += 11; 
			break; 
		case '4': 
			bin += 100; 
			break; 
		case '5': 
			bin += 101; 
			break; 
		case '6': 
			bin += 110; 
			break; 
		case '7': 
			bin += 111; 
			break; 
		case '8': 
			bin += 1000; 
			break; 
		case '9': 
			bin += 1001; 
			break; 
		case 'a': 
		case 'A': 
			bin += 1010; 
			break; 
		case 'b': 
		case 'B': 
			bin += 1011; 
			break; 
		case 'c': 
		case 'C': 
			bin += 1100; 
			break; 
		case 'd': 
		case 'D': 
			bin += 1101; 
			break; 
		case 'e': 
		case 'E': 
			bin += 1110; 
			break; 
		case 'f': 
		case 'F': 
			bin += 1111; 
			break; 
		default: 
			printf("Invalid hexadecimal input."); 
		} 

		place = 10000; 
	} 

	return bin; 
} 

// التحويل من النظام الثنائي إلى النظام الثماني
long long int bin_to_oct(long long bin) 
{ 
	long long int octal, place; 
	int i = 0, rem, val; 

	octal = 0ll; 
	place = 0ll; 

	place = 1; 

	while (bin > 0) { 
		rem = bin % 1000; 

		switch (rem) { 
		case 0: 
			val = 0; 
			break; 
		case 1: 
			val = 1; 
			break; 
		case 10: 
			val = 2; 
			break; 
		case 11: 
			val = 3; 
			break; 
		case 100: 
			val = 4; 
			break; 
		case 101: 
			val = 5; 
			break; 
		case 110: 
			val = 6; 
			break; 
		case 111: 
			val = 7; 
			break; 
		} 

		octal = (val * place) + octal; 
		bin /= 1000; 

		place *= 10; 
	} 

	return octal; 
} 

// تحول الدالة العدد المعطى من النظام السداسي عشر إلى النظام الثماني
long long int hex_to_oct(char hex[]) 
{ 
	long long int octal, bin; 

	// التحويل من النظام السداسي عشر إلى النظام الثنائي 
	bin = hex_to_bin(hex); 

	// التحويل من النظام الثنائي إلى النظام الثماني
	octal = bin_to_oct(bin); 

	return octal; 
} 

// اختبار الدوال السابقة
int main() 
{ 

// العدد المطلوب تحويله من النظام السداسي عشر إلى النظام الثماني
	char hex[20] = "1AC"; 

	printf("Equivalent Octal Value = %lld", 
hex_to_oct(hex)); 

	return 0; 
}

مصادر