التحويل من النظام الثنائي إلى النظام العشري

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

يمكن تحويل الأعداد من النظام الثنائي Binary System إلى النظام العشري Decimal System عن طريق استخراج الأرقام من العدد الثنائي المعطى بدءًا من جهة اليمين وضرب كل رقم بالعدد 2 مرفوعًا للأسّ المناسب لكل مرتبة، وتخزين النتيجة في متغير.

فعلى سبيل المثال:

لو أردنا تحويل العدد الثنائي 111 إلى النظام العشري، فإنّ النتيجة ستكون:

dec_value = 1*(2^2) + 1*(2^1) + 1*(2^0) = 7

يوضّح المخطط التالي طريقة تحويل العدد (1010) إلى النظام العشري:


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

يمكن تحويل الأعداد من النظام الثنائي إلى النظام العشري بطريقتين هما التكرارية والتعاودية.

الطريقة التكرارية

  • C++‎:
#include <iostream> 
using namespace std; 

int binaryToDecimal(int n) 
{ 
	int num = n; 
	int dec_value = 0; 

	// تهيئة القيمة الأساسية لتكون 1 والتي تساوي 2^0
	int base = 1; 

	int temp = num; 
	while (temp) { 
		int last_digit = temp % 10; 
		temp = temp / 10; 

		dec_value += last_digit * base; 

		base = base * 2; 
	} 

	return dec_value; 
} 

// اختبار الدالة السابقة
int main() 
{ 
	int num = 10101001; 

	cout << binaryToDecimal(num) << endl; 
}
  • بايثون:
def binaryToDecimal(n): 
	num = n; 
	dec_value = 0; 
	
	# تهيئة القيمة الأساسية لتكون 1 والتي تساوي 2^0
	base = 1; 
	
	temp = num; 
	while(temp): 
		last_digit = temp % 10; 
		temp = int(temp / 10); 
		
		dec_value += last_digit * base; 
		base = base * 2; 
	return dec_value; 

# اختبار الدالة السابقة
num = 10101001; 
print(binaryToDecimal(num));
  • جافا:
class GFG { 
	static int binaryToDecimal(int n) 
	{ 
		int num = n; 
		int dec_value = 0; 

		// تهيئة القيمة الأساسية لتكون 1 والتي تساوي 2^0 
		int base = 1; 

		int temp = num; 
		while (temp > 0) { 
			int last_digit = temp % 10; 
			temp = temp / 10; 

			dec_value += last_digit * base; 

			base = base * 2; 
		} 

		return dec_value; 
	} 

	// اختبار الدالة السابقة
	public static void main(String[] args) 
	{ 
		int num = 10101001; 
		System.out.println(binaryToDecimal(num)); 
	} 
}

تعمل الشيفرة السابقة مع الأعداد الثنائي ضمن نطاق الأعداد الصحيحة integers. إن كان المطلوب تحويل أعداد كبيرة جدًّا من نوع long مثل ‎20 bit‎ أو ‎30 bit‎ فيمكن استخدام متغير نصّي لتخزين الأعداد الثنائية.

  • C++‎:
#include <iostream> 
#include <string> 
using namespace std; 

int binaryToDecimal(string n) 
{ 
	string num = n; 
	int dec_value = 0; 

	int base = 1; 

	int len = num.length(); 
	for (int i = len - 1; i >= 0; i--) { 
		if (num[i] == '1') 
			dec_value += base; 
		base = base * 2; 
	} 

	return dec_value; 
} 

int main() 
{ 
	string num = "10101001"; 
	cout << binaryToDecimal(num) << endl; 
}
  • بايثون:
def binaryToDecimal(n): 
	num = n; 
	dec_value = 0; 
	
	base1 = 1; 
	
	len1 = len(num); 
	for i in range(len1 - 1, -1, -1): 
		if (num[i] == '1'):	 
			dec_value += base1; 
		base1 = base1 * 2; 
	
	return dec_value; 

num = "10101001"; 
print(binaryToDecimal(num));
  • جافا:
import java.io.*; 

class GFG { 

	static int binaryToDecimal(String n) 
	{ 
		String num = n; 
		int dec_value = 0; 

		int base = 1; 

		int len = num.length(); 
		for (int i = len - 1; i >= 0; i--) { 
			if (num.charAt(i) == '1') 
				dec_value += base; 
			base = base * 2; 
		} 

		return dec_value; 
	} 

	public static void main(String[] args) 
	{ 
		String num = new String("10101001"); 
		System.out.println(binaryToDecimal(num)); 
	} 
}

تعطي الشيفرات السابقة المعطيات التالية:

169

ملاحظة: يمكن الحصول على نفس النتيجة في لغة جافا باستخدام الدالة Integer.parseInt()‎:

public class GFG { 
    public static void main(String args[]) 
    { 
        String binaryNumber = "1001"; 
        System.out.println(Integer.parseInt(binaryNumber, 2)); 
    } 
}

الطريقة التعاودية

يمكن تحويل الطريقة التكرارية إلى طريقة تعاودية وتوضّح الأمثلة التالية ذلك:

  • C++‎:
#include<bits/stdc++.h> 
using namespace std; 

int toDecimal(string binary, int i=0) 
{ 
	// إن وصلنا إلى الحرف الأخير
	int n = binary.length(); 
	if (i == n-1) 
	return binary[i] - '0'; 
	
	// إضافة العنصر الحالي ثم استدعاء الدالة لنفسها مرة أخرى
	return ((binary[i] - '0') << (n-i-1)) + 
			toDecimal(binary, i+1); 
} 

// اختبار الشيفرة السابقة
int main() 
{ 
	string binary = "1010"; 
	cout << toDecimal(binary) << endl; 
	return 0; 
}
  • بايثون:
def toDecimal(binary, i = 0): 

	# إن وصلنا إلى الحرف الأخير
	n = len(binary) 
	if (i == n - 1) : 
		return int(binary[i]) - 0
	
	# إضافة العنصر الحالي واستدعاء الدالة لنفسها مرة أخرى
	return (((int(binary[i]) - 0) << (n - i - 1)) +
						toDecimal(binary, i + 1)) 

# اختبار الدالة السابقة
if __name__ == "__main__" : 
	
	binary = "1010"
	print(toDecimal(binary))
  • جافا:
class GFG 
{ 
	static int toDecimal(String binary,int i) 
	{ 
		// إن وصلنا إلى الحرف الأخير
		int n = binary.length(); 
		if (i == n-1) 
		return binary.charAt(i) - '0'; 
		
		// إضافة العنصر الحالي واستدعاء الدالة لنفسها مرة أخرى
		return ((binary.charAt(i) - '0') << (n-i-1)) + 
				toDecimal(binary, i+1); 
	} 
	
	// اختبار الدالة السابقة
	public static void main(String []args) 
	{ 
		String binary = "1010"; 
		int i=0; 
		System.out.println(toDecimal(binary,i)); 
		
	} 

}

مصادر